2017-04-15 20:26:05 +02:00
package archive
import (
2017-10-02 18:43:03 +02:00
"archive/tar"
2018-07-25 02:33:31 +02:00
"archive/zip"
2017-10-02 18:43:03 +02:00
"compress/gzip"
2020-03-04 05:52:43 +02:00
"fmt"
2017-10-02 18:43:03 +02:00
"io"
2018-11-11 23:02:45 +02:00
"io/ioutil"
2017-04-15 20:26:05 +02:00
"os"
"path/filepath"
"testing"
2017-12-17 22:40:19 +02:00
"github.com/goreleaser/goreleaser/internal/artifact"
2017-07-23 21:27:46 +02:00
"github.com/goreleaser/goreleaser/internal/testlib"
2018-11-11 23:02:45 +02:00
"github.com/goreleaser/goreleaser/pkg/archive"
2018-08-15 04:50:20 +02:00
"github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context"
2018-07-09 05:54:42 +02:00
"github.com/stretchr/testify/require"
2017-04-15 20:26:05 +02:00
)
func TestDescription ( t * testing . T ) {
2018-11-11 22:17:44 +02:00
require . NotEmpty ( t , Pipe { } . String ( ) )
2017-04-15 20:26:05 +02:00
}
2020-02-06 03:08:18 +02:00
func createFakeBinary ( t * testing . T , dist , arch , bin string ) {
2020-03-28 20:40:16 +02:00
var path = filepath . Join ( dist , arch , bin )
require . NoError ( t , os . MkdirAll ( filepath . Dir ( path ) , 0755 ) )
_ , err := os . Create ( path )
2020-02-06 03:08:18 +02:00
require . NoError ( t , err )
}
2017-04-15 20:26:05 +02:00
func TestRunPipe ( t * testing . T ) {
2017-07-23 21:27:46 +02:00
folder , back := testlib . Mktmp ( t )
defer back ( )
2017-12-19 01:32:44 +02:00
for _ , format := range [ ] string { "tar.gz" , "zip" } {
t . Run ( "Archive format " + format , func ( tt * testing . T ) {
2018-11-11 22:17:44 +02:00
var dist = filepath . Join ( folder , format + "_dist" )
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
2020-02-06 03:08:18 +02:00
for _ , arch := range [ ] string { "darwinamd64" , "linux386" , "linuxarm7" , "linuxmipssoftfloat" } {
2020-03-28 20:40:16 +02:00
createFakeBinary ( t , dist , arch , "bin/mybin" )
2020-02-06 03:08:18 +02:00
}
2020-03-28 20:40:16 +02:00
createFakeBinary ( t , dist , "windowsamd64" , "bin/mybin.exe" )
2020-03-04 05:52:43 +02:00
for _ , tt := range [ ] string { "darwin" , "linux" , "windows" } {
_ , err := os . Create ( filepath . Join ( folder , fmt . Sprintf ( "README.%s.md" , tt ) ) )
require . NoError ( t , err )
}
2018-11-11 22:17:44 +02:00
require . NoError ( t , os . MkdirAll ( filepath . Join ( folder , "foo" , "bar" , "foobar" ) , 0755 ) )
2020-03-04 05:52:43 +02:00
_ , err := os . Create ( filepath . Join ( filepath . Join ( folder , "foo" , "bar" , "foobar" , "blah.txt" ) ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2017-12-19 01:32:44 +02:00
var ctx = context . New (
config . Project {
Dist : dist ,
ProjectName : "foobar" ,
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
2020-02-06 03:08:18 +02:00
ID : "myid" ,
2019-04-16 15:19:15 +02:00
Builds : [ ] string { "default" } ,
NameTemplate : defaultNameTemplate ,
Files : [ ] string {
2020-03-04 05:52:43 +02:00
"README.{{.Os}}.*" ,
2019-04-16 15:19:15 +02:00
"./foo/**/*" ,
} ,
FormatOverrides : [ ] config . FormatOverride {
{
Goos : "windows" ,
Format : "zip" ,
} ,
2017-12-19 01:32:44 +02:00
} ,
} ,
2017-04-21 21:01:19 +02:00
} ,
} ,
2017-12-19 01:32:44 +02:00
)
2019-08-12 22:44:48 +02:00
var darwinBuild = & artifact . Artifact {
2017-12-19 01:32:44 +02:00
Goos : "darwin" ,
Goarch : "amd64" ,
2020-03-28 20:40:16 +02:00
Name : "bin/mybin" ,
Path : filepath . Join ( dist , "darwinamd64" , "bin" , "mybin" ) ,
2017-12-19 01:32:44 +02:00
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2020-03-28 20:40:16 +02:00
"Binary" : "bin/mybin" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2017-12-19 01:32:44 +02:00
} ,
2019-01-01 18:40:17 +02:00
}
2020-02-06 03:08:18 +02:00
var linux386Build = & artifact . Artifact {
Goos : "linux" ,
Goarch : "386" ,
2020-03-28 20:40:16 +02:00
Name : "bin/mybin" ,
Path : filepath . Join ( dist , "linux386" , "bin" , "mybin" ) ,
2020-02-06 03:08:18 +02:00
Type : artifact . Binary ,
Extra : map [ string ] interface { } {
2020-03-28 20:40:16 +02:00
"Binary" : "bin/mybin" ,
2020-02-06 03:08:18 +02:00
"ID" : "default" ,
} ,
}
var linuxArmBuild = & artifact . Artifact {
Goos : "linux" ,
Goarch : "arm" ,
Goarm : "7" ,
2020-03-28 20:40:16 +02:00
Name : "bin/mybin" ,
Path : filepath . Join ( dist , "linuxarm7" , "bin" , "mybin" ) ,
2020-02-06 03:08:18 +02:00
Type : artifact . Binary ,
Extra : map [ string ] interface { } {
2020-03-28 20:40:16 +02:00
"Binary" : "bin/mybin" ,
2020-02-06 03:08:18 +02:00
"ID" : "default" ,
} ,
}
var linuxMipsBuild = & artifact . Artifact {
Goos : "linux" ,
Goarch : "mips" ,
Gomips : "softfloat" ,
2020-03-28 20:40:16 +02:00
Name : "bin/mybin" ,
Path : filepath . Join ( dist , "linuxmipssoftfloat" , "bin" , "mybin" ) ,
2020-02-06 03:08:18 +02:00
Type : artifact . Binary ,
Extra : map [ string ] interface { } {
"Binary" : "mybin" ,
"ID" : "default" ,
} ,
}
2019-08-12 22:44:48 +02:00
var windowsBuild = & artifact . Artifact {
2017-12-19 01:32:44 +02:00
Goos : "windows" ,
Goarch : "amd64" ,
2020-03-28 20:40:16 +02:00
Name : "bin/mybin.exe" ,
Path : filepath . Join ( dist , "windowsamd64" , "bin" , "mybin.exe" ) ,
2017-12-19 01:32:44 +02:00
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2017-12-19 01:32:44 +02:00
"Binary" : "mybin" ,
"Extension" : ".exe" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2017-12-19 01:32:44 +02:00
} ,
2019-01-01 18:40:17 +02:00
}
ctx . Artifacts . Add ( darwinBuild )
2020-02-06 03:08:18 +02:00
ctx . Artifacts . Add ( linux386Build )
ctx . Artifacts . Add ( linuxArmBuild )
ctx . Artifacts . Add ( linuxMipsBuild )
2019-01-01 18:40:17 +02:00
ctx . Artifacts . Add ( windowsBuild )
2017-12-19 01:32:44 +02:00
ctx . Version = "0.0.1"
2018-07-09 05:54:42 +02:00
ctx . Git . CurrentTag = "v0.0.1"
2019-04-16 15:19:15 +02:00
ctx . Config . Archives [ 0 ] . Format = format
2018-11-11 22:17:44 +02:00
require . NoError ( tt , Pipe { } . Run ( ctx ) )
2020-02-06 03:08:18 +02:00
var archives = ctx . Artifacts . Filter ( artifact . ByType ( artifact . UploadableArchive ) ) . List ( )
for _ , arch := range archives {
require . Equal ( t , "myid" , arch . Extra [ "ID" ] . ( string ) , "all archives should have the archive ID set" )
2019-04-16 15:19:15 +02:00
}
2020-02-06 03:08:18 +02:00
require . Len ( t , archives , 5 )
// TODO: should verify the artifact fields here too
2019-01-01 18:40:17 +02:00
2018-11-11 22:17:44 +02:00
if format == "tar.gz" {
// Check archive contents
2020-03-04 05:52:43 +02:00
for name , os := range map [ string ] string {
"foobar_0.0.1_darwin_amd64.tar.gz" : "darwin" ,
"foobar_0.0.1_linux_386.tar.gz" : "linux" ,
"foobar_0.0.1_linux_armv7.tar.gz" : "linux" ,
"foobar_0.0.1_linux_mips_softfloat.tar.gz" : "linux" ,
2020-02-06 03:08:18 +02:00
} {
require . Equal (
t ,
[ ] string {
2020-03-04 05:52:43 +02:00
fmt . Sprintf ( "README.%s.md" , os ) ,
2020-02-06 03:08:18 +02:00
"foo/bar/foobar/blah.txt" ,
2020-03-28 20:40:16 +02:00
"bin/mybin" ,
2020-02-06 03:08:18 +02:00
} ,
tarFiles ( t , filepath . Join ( dist , name ) ) ,
)
}
2018-11-11 22:17:44 +02:00
}
if format == "zip" {
require . Equal (
t ,
[ ] string {
2020-03-04 05:52:43 +02:00
"README.windows.md" ,
2018-11-11 22:17:44 +02:00
"foo/bar/foobar/blah.txt" ,
2020-03-28 20:40:16 +02:00
"bin/mybin.exe" ,
2018-11-11 22:17:44 +02:00
} ,
zipFiles ( t , filepath . Join ( dist , "foobar_0.0.1_windows_amd64.zip" ) ) ,
)
}
2017-04-15 20:26:05 +02:00
} )
}
2018-07-25 02:33:31 +02:00
}
2020-10-10 13:46:16 +02:00
func TestRunPipeDifferentBinaryCount ( t * testing . T ) {
folder , back := testlib . Mktmp ( t )
defer back ( )
var dist = filepath . Join ( folder , "dist" )
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
for _ , arch := range [ ] string { "darwinamd64" , "linuxamd64" } {
createFakeBinary ( t , dist , arch , "bin/mybin" )
}
createFakeBinary ( t , dist , "darwinamd64" , "bin/foobar" )
var ctx = context . New ( config . Project {
Dist : dist ,
ProjectName : "foobar" ,
Archives : [ ] config . Archive {
{
ID : "myid" ,
Format : "tar.gz" ,
Builds : [ ] string { "default" , "foobar" } ,
NameTemplate : defaultNameTemplate ,
} ,
} ,
} )
var darwinBuild = & artifact . Artifact {
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "bin/mybin" ,
Path : filepath . Join ( dist , "darwinamd64" , "bin" , "mybin" ) ,
Type : artifact . Binary ,
Extra : map [ string ] interface { } {
"Binary" : "bin/mybin" ,
"ID" : "default" ,
} ,
}
var darwinBuild2 = & artifact . Artifact {
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "bin/foobar" ,
Path : filepath . Join ( dist , "darwinamd64" , "bin" , "foobar" ) ,
Type : artifact . Binary ,
Extra : map [ string ] interface { } {
"Binary" : "bin/foobar" ,
"ID" : "foobar" ,
} ,
}
var linuxArmBuild = & artifact . Artifact {
Goos : "linux" ,
Goarch : "amd64" ,
Name : "bin/mybin" ,
Path : filepath . Join ( dist , "linuxamd64" , "bin" , "mybin" ) ,
Type : artifact . Binary ,
Extra : map [ string ] interface { } {
"Binary" : "bin/mybin" ,
"ID" : "default" ,
} ,
}
ctx . Artifacts . Add ( darwinBuild )
ctx . Artifacts . Add ( darwinBuild2 )
ctx . Artifacts . Add ( linuxArmBuild )
ctx . Version = "0.0.1"
ctx . Git . CurrentTag = "v0.0.1"
2020-10-13 22:57:08 +02:00
t . Run ( "check enabled" , func ( t * testing . T ) {
ctx . Config . Archives [ 0 ] . AllowDifferentBinaryCount = false
require . EqualError ( t , Pipe { } . Run ( ctx ) , "invalid archive: 0: " + ErrArchiveDifferentBinaryCount . Error ( ) )
} )
t . Run ( "check disabled" , func ( t * testing . T ) {
ctx . Config . Archives [ 0 ] . AllowDifferentBinaryCount = true
require . NoError ( t , Pipe { } . Run ( ctx ) )
} )
2020-10-10 13:46:16 +02:00
}
2020-10-11 18:00:42 +02:00
func TestRunPipeNoBinaries ( t * testing . T ) {
folder , back := testlib . Mktmp ( t )
defer back ( )
var dist = filepath . Join ( folder , "dist" )
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
var ctx = context . New ( config . Project {
Dist : dist ,
ProjectName : "foobar" ,
Archives : [ ] config . Archive { { } } ,
} )
ctx . Version = "0.0.1"
ctx . Git . CurrentTag = "v0.0.1"
require . NoError ( t , Pipe { } . Run ( ctx ) )
}
2018-07-25 02:33:31 +02:00
func zipFiles ( t * testing . T , path string ) [ ] string {
f , err := os . Open ( path )
require . NoError ( t , err )
info , err := f . Stat ( )
require . NoError ( t , err )
r , err := zip . NewReader ( f , info . Size ( ) )
require . NoError ( t , err )
var paths = make ( [ ] string , len ( r . File ) )
for i , zf := range r . File {
paths [ i ] = zf . Name
}
return paths
}
func tarFiles ( t * testing . T , path string ) [ ] string {
f , err := os . Open ( path )
require . NoError ( t , err )
defer f . Close ( )
2017-10-02 18:43:03 +02:00
gr , err := gzip . NewReader ( f )
2018-07-25 02:33:31 +02:00
require . NoError ( t , err )
defer gr . Close ( )
var r = tar . NewReader ( gr )
var paths [ ] string
for {
next , err := r . Next ( )
2017-10-02 18:43:03 +02:00
if err == io . EOF {
break
}
2018-07-25 02:33:31 +02:00
require . NoError ( t , err )
paths = append ( paths , next . Name )
2017-10-02 18:43:03 +02:00
}
2018-07-25 02:33:31 +02:00
return paths
2017-04-15 20:26:05 +02:00
}
2017-04-21 21:03:36 +02:00
2017-06-08 11:41:09 +02:00
func TestRunPipeBinary ( t * testing . T ) {
2017-07-23 21:27:46 +02:00
folder , back := testlib . Mktmp ( t )
defer back ( )
2017-06-05 16:38:59 +02:00
var dist = filepath . Join ( folder , "dist" )
2018-11-11 22:17:44 +02:00
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "darwinamd64" ) , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "windowsamd64" ) , 0755 ) )
2017-12-17 22:40:19 +02:00
_ , err := os . Create ( filepath . Join ( dist , "darwinamd64" , "mybin" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2017-12-17 22:40:19 +02:00
_ , err = os . Create ( filepath . Join ( dist , "windowsamd64" , "mybin.exe" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2017-06-05 16:38:59 +02:00
_ , err = os . Create ( filepath . Join ( folder , "README.md" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2017-12-17 22:40:19 +02:00
var ctx = context . New (
config . Project {
2017-06-05 16:38:59 +02:00
Dist : dist ,
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Format : "binary" ,
NameTemplate : defaultBinaryNameTemplate ,
Builds : [ ] string { "default" } ,
} ,
2017-06-05 16:38:59 +02:00
} ,
} ,
2017-12-17 22:40:19 +02:00
)
2017-12-19 01:32:44 +02:00
ctx . Version = "0.0.1"
2018-07-09 05:54:42 +02:00
ctx . Git . CurrentTag = "v0.0.1"
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2017-12-17 22:40:19 +02:00
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "mybin" ,
Path : filepath . Join ( dist , "darwinamd64" , "mybin" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2017-12-17 22:40:19 +02:00
"Binary" : "mybin" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2017-12-17 22:40:19 +02:00
} ,
} )
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2017-12-17 22:40:19 +02:00
Goos : "windows" ,
Goarch : "amd64" ,
Name : "mybin.exe" ,
Path : filepath . Join ( dist , "windowsamd64" , "mybin.exe" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2017-12-17 22:40:19 +02:00
"Binary" : "mybin" ,
2017-12-19 01:32:44 +02:00
"Ext" : ".exe" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2017-12-17 22:40:19 +02:00
} ,
} )
2018-11-11 22:17:44 +02:00
require . NoError ( t , Pipe { } . Run ( ctx ) )
2017-12-17 22:40:19 +02:00
var binaries = ctx . Artifacts . Filter ( artifact . ByType ( artifact . UploadableBinary ) )
2017-12-19 01:32:44 +02:00
darwin := binaries . Filter ( artifact . ByGoos ( "darwin" ) ) . List ( ) [ 0 ]
windows := binaries . Filter ( artifact . ByGoos ( "windows" ) ) . List ( ) [ 0 ]
2018-11-11 22:17:44 +02:00
require . Equal ( t , "mybin_0.0.1_darwin_amd64" , darwin . Name )
require . Equal ( t , "mybin_0.0.1_windows_amd64.exe" , windows . Name )
require . Len ( t , binaries . List ( ) , 2 )
2017-06-05 16:38:59 +02:00
}
2017-04-22 15:29:53 +02:00
func TestRunPipeDistRemoved ( t * testing . T ) {
2017-12-17 22:40:19 +02:00
var ctx = context . New (
config . Project {
2020-03-28 20:40:16 +02:00
Dist : "/tmp/path/to/nope" ,
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
NameTemplate : "nope" ,
Format : "zip" ,
Builds : [ ] string { "default" } ,
} ,
2017-04-22 15:29:53 +02:00
} ,
} ,
2017-12-17 22:40:19 +02:00
)
2018-07-09 05:54:42 +02:00
ctx . Git . CurrentTag = "v0.0.1"
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2017-12-17 22:40:19 +02:00
Goos : "windows" ,
Goarch : "amd64" ,
Name : "mybin.exe" ,
2020-03-28 20:40:16 +02:00
Path : filepath . Join ( "/tmp/path/to/nope" , "windowsamd64" , "mybin.exe" ) ,
2017-12-17 22:40:19 +02:00
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2017-12-19 01:32:44 +02:00
"Binary" : "mybin" ,
"Extension" : ".exe" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2017-05-11 05:05:51 +02:00
} ,
2017-12-17 22:40:19 +02:00
} )
2020-03-28 20:40:16 +02:00
// not checking on error msg because it may change depending on OS/version
require . Error ( t , Pipe { } . Run ( ctx ) )
2017-05-11 05:05:51 +02:00
}
2017-12-17 22:40:19 +02:00
func TestRunPipeInvalidGlob ( t * testing . T ) {
2017-07-23 21:27:46 +02:00
folder , back := testlib . Mktmp ( t )
defer back ( )
2017-12-17 22:40:19 +02:00
var dist = filepath . Join ( folder , "dist" )
2018-11-11 22:17:44 +02:00
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "darwinamd64" ) , 0755 ) )
2017-12-17 22:40:19 +02:00
_ , err := os . Create ( filepath . Join ( dist , "darwinamd64" , "mybin" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2017-12-17 22:40:19 +02:00
var ctx = context . New (
config . Project {
Dist : dist ,
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Builds : [ ] string { "default" } ,
NameTemplate : "foo" ,
Format : "zip" ,
Files : [ ] string {
"[x-]" ,
} ,
2017-05-11 05:05:51 +02:00
} ,
} ,
} ,
2017-12-17 22:40:19 +02:00
)
2018-07-09 05:54:42 +02:00
ctx . Git . CurrentTag = "v0.0.1"
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2017-12-17 22:40:19 +02:00
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "mybin" ,
Path : filepath . Join ( "dist" , "darwinamd64" , "mybin" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2017-12-17 22:40:19 +02:00
"Binary" : "mybin" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2017-12-17 22:40:19 +02:00
} ,
} )
2020-11-10 16:20:55 +02:00
require . EqualError ( t , Pipe { } . Run ( ctx ) , ` failed to find files to archive: globbing failed for pattern [x-]: compile glob pattern: unexpected end of input ` )
2017-05-11 05:05:51 +02:00
}
2018-11-11 16:12:48 +02:00
2018-11-14 13:38:29 +02:00
func TestRunPipeInvalidNameTemplate ( t * testing . T ) {
folder , back := testlib . Mktmp ( t )
defer back ( )
var dist = filepath . Join ( folder , "dist" )
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "darwinamd64" ) , 0755 ) )
_ , err := os . Create ( filepath . Join ( dist , "darwinamd64" , "mybin" ) )
require . NoError ( t , err )
var ctx = context . New (
config . Project {
Dist : dist ,
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Builds : [ ] string { "default" } ,
NameTemplate : "foo{{ .fff }" ,
Format : "zip" ,
} ,
2018-11-14 13:38:29 +02:00
} ,
} ,
)
ctx . Git . CurrentTag = "v0.0.1"
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2018-11-14 13:38:29 +02:00
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "mybin" ,
Path : filepath . Join ( "dist" , "darwinamd64" , "mybin" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2018-11-14 13:38:29 +02:00
"Binary" : "mybin" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2018-11-14 13:38:29 +02:00
} ,
} )
require . EqualError ( t , Pipe { } . Run ( ctx ) , ` template: tmpl:1: unexpected "}" in operand ` )
}
2020-03-04 05:52:43 +02:00
func TestRunPipeInvalidFilesNameTemplate ( t * testing . T ) {
folder , back := testlib . Mktmp ( t )
defer back ( )
var dist = filepath . Join ( folder , "dist" )
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "darwinamd64" ) , 0755 ) )
_ , err := os . Create ( filepath . Join ( dist , "darwinamd64" , "mybin" ) )
require . NoError ( t , err )
var ctx = context . New (
config . Project {
Dist : dist ,
Archives : [ ] config . Archive {
{
Builds : [ ] string { "default" } ,
NameTemplate : "foo" ,
Format : "zip" ,
Files : [ ] string {
"{{.asdsd}" ,
} ,
} ,
} ,
} ,
)
ctx . Git . CurrentTag = "v0.0.1"
ctx . Artifacts . Add ( & artifact . Artifact {
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "mybin" ,
Path : filepath . Join ( "dist" , "darwinamd64" , "mybin" ) ,
Type : artifact . Binary ,
Extra : map [ string ] interface { } {
"Binary" : "mybin" ,
"ID" : "default" ,
} ,
} )
require . EqualError ( t , Pipe { } . Run ( ctx ) , ` failed to find files to archive: failed to apply template {{ .asdsd } : template : tmpl : 1 : unexpected "}" in operand ` )
}
2018-11-14 13:38:29 +02:00
func TestRunPipeInvalidWrapInDirectoryTemplate ( t * testing . T ) {
folder , back := testlib . Mktmp ( t )
defer back ( )
var dist = filepath . Join ( folder , "dist" )
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "darwinamd64" ) , 0755 ) )
_ , err := os . Create ( filepath . Join ( dist , "darwinamd64" , "mybin" ) )
require . NoError ( t , err )
var ctx = context . New (
config . Project {
Dist : dist ,
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Builds : [ ] string { "default" } ,
NameTemplate : "foo" ,
WrapInDirectory : "foo{{ .fff }" ,
Format : "zip" ,
} ,
2018-11-14 13:38:29 +02:00
} ,
} ,
)
ctx . Git . CurrentTag = "v0.0.1"
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2018-11-14 13:38:29 +02:00
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "mybin" ,
Path : filepath . Join ( "dist" , "darwinamd64" , "mybin" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2018-11-14 13:38:29 +02:00
"Binary" : "mybin" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2018-11-14 13:38:29 +02:00
} ,
} )
require . EqualError ( t , Pipe { } . Run ( ctx ) , ` template: tmpl:1: unexpected "}" in operand ` )
}
2017-10-02 18:43:03 +02:00
func TestRunPipeWrap ( t * testing . T ) {
folder , back := testlib . Mktmp ( t )
defer back ( )
var dist = filepath . Join ( folder , "dist" )
2018-11-11 22:17:44 +02:00
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "darwinamd64" ) , 0755 ) )
2017-12-17 22:40:19 +02:00
_ , err := os . Create ( filepath . Join ( dist , "darwinamd64" , "mybin" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2017-10-02 18:43:03 +02:00
_ , err = os . Create ( filepath . Join ( folder , "README.md" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2017-12-17 22:40:19 +02:00
var ctx = context . New (
config . Project {
2017-10-02 18:43:03 +02:00
Dist : dist ,
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Builds : [ ] string { "default" } ,
NameTemplate : "foo" ,
WrapInDirectory : "foo_{{ .Os }}" ,
Format : "tar.gz" ,
Replacements : map [ string ] string {
"darwin" : "macOS" ,
} ,
Files : [ ] string {
"README.*" ,
} ,
2017-10-02 18:43:03 +02:00
} ,
} ,
} ,
2017-12-17 22:40:19 +02:00
)
2018-07-09 05:54:42 +02:00
ctx . Git . CurrentTag = "v0.0.1"
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2017-12-17 22:40:19 +02:00
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "mybin" ,
Path : filepath . Join ( "dist" , "darwinamd64" , "mybin" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2017-12-17 22:40:19 +02:00
"Binary" : "mybin" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2017-12-17 22:40:19 +02:00
} ,
} )
2018-11-11 22:17:44 +02:00
require . NoError ( t , Pipe { } . Run ( ctx ) )
2017-10-02 18:43:03 +02:00
2020-04-21 21:11:18 +02:00
var archives = ctx . Artifacts . Filter ( artifact . ByType ( artifact . UploadableArchive ) ) . List ( )
require . Len ( t , archives , 1 )
require . Equal ( t , "foo_macOS" , archives [ 0 ] . ExtraOr ( "WrappedIn" , "" ) )
2017-10-02 18:43:03 +02:00
// Check archive contents
2017-12-17 22:40:19 +02:00
f , err := os . Open ( filepath . Join ( dist , "foo.tar.gz" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
defer func ( ) { require . NoError ( t , f . Close ( ) ) } ( )
2017-10-02 18:43:03 +02:00
gr , err := gzip . NewReader ( f )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
defer func ( ) { require . NoError ( t , gr . Close ( ) ) } ( )
2017-10-02 18:43:03 +02:00
r := tar . NewReader ( gr )
for _ , n := range [ ] string { "README.md" , "mybin" } {
h , err := r . Next ( )
if err == io . EOF {
break
}
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2018-11-13 17:48:16 +02:00
require . Equal ( t , filepath . Join ( "foo_macOS" , n ) , h . Name )
2017-10-02 18:43:03 +02:00
}
}
2017-12-03 04:24:55 +02:00
func TestDefault ( t * testing . T ) {
var ctx = & context . Context {
Config : config . Project {
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive { } ,
2017-12-03 04:24:55 +02:00
} ,
}
2018-11-11 22:17:44 +02:00
require . NoError ( t , Pipe { } . Default ( ctx ) )
2019-04-16 15:19:15 +02:00
require . NotEmpty ( t , ctx . Config . Archives [ 0 ] . NameTemplate )
require . Equal ( t , "tar.gz" , ctx . Config . Archives [ 0 ] . Format )
require . NotEmpty ( t , ctx . Config . Archives [ 0 ] . Files )
2017-12-03 04:24:55 +02:00
}
func TestDefaultSet ( t * testing . T ) {
var ctx = & context . Context {
Config : config . Project {
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Builds : [ ] string { "default" } ,
NameTemplate : "foo" ,
Format : "zip" ,
Files : [ ] string {
"foo" ,
} ,
2017-12-03 04:24:55 +02:00
} ,
} ,
} ,
}
2018-11-11 22:17:44 +02:00
require . NoError ( t , Pipe { } . Default ( ctx ) )
2019-04-16 15:19:15 +02:00
require . Equal ( t , "foo" , ctx . Config . Archives [ 0 ] . NameTemplate )
require . Equal ( t , "zip" , ctx . Config . Archives [ 0 ] . Format )
require . Equal ( t , "foo" , ctx . Config . Archives [ 0 ] . Files [ 0 ] )
2017-12-03 04:24:55 +02:00
}
2017-12-19 01:15:32 +02:00
2017-12-27 01:19:58 +02:00
func TestDefaultFormatBinary ( t * testing . T ) {
var ctx = & context . Context {
Config : config . Project {
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Format : "binary" ,
} ,
2017-12-27 01:19:58 +02:00
} ,
} ,
}
2018-11-11 22:17:44 +02:00
require . NoError ( t , Pipe { } . Default ( ctx ) )
2019-04-16 15:19:15 +02:00
require . Equal ( t , defaultBinaryNameTemplate , ctx . Config . Archives [ 0 ] . NameTemplate )
2017-12-27 01:19:58 +02:00
}
2017-12-19 01:15:32 +02:00
func TestFormatFor ( t * testing . T ) {
var ctx = & context . Context {
Config : config . Project {
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Builds : [ ] string { "default" } ,
Format : "tar.gz" ,
FormatOverrides : [ ] config . FormatOverride {
{
Goos : "windows" ,
Format : "zip" ,
} ,
2017-12-19 01:15:32 +02:00
} ,
} ,
} ,
} ,
}
2019-04-16 15:19:15 +02:00
require . Equal ( t , "zip" , packageFormat ( ctx . Config . Archives [ 0 ] , "windows" ) )
require . Equal ( t , "tar.gz" , packageFormat ( ctx . Config . Archives [ 0 ] , "linux" ) )
2017-12-19 01:15:32 +02:00
}
2018-03-17 03:52:04 +02:00
func TestBinaryOverride ( t * testing . T ) {
folder , back := testlib . Mktmp ( t )
defer back ( )
var dist = filepath . Join ( folder , "dist" )
2018-11-11 22:17:44 +02:00
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "darwinamd64" ) , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "windowsamd64" ) , 0755 ) )
2018-03-17 03:52:04 +02:00
_ , err := os . Create ( filepath . Join ( dist , "darwinamd64" , "mybin" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2018-03-17 03:52:04 +02:00
_ , err = os . Create ( filepath . Join ( dist , "windowsamd64" , "mybin.exe" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2018-03-17 03:52:04 +02:00
_ , err = os . Create ( filepath . Join ( folder , "README.md" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2018-03-17 03:52:04 +02:00
for _ , format := range [ ] string { "tar.gz" , "zip" } {
t . Run ( "Archive format " + format , func ( tt * testing . T ) {
var ctx = context . New (
config . Project {
Dist : dist ,
ProjectName : "foobar" ,
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Builds : [ ] string { "default" } ,
NameTemplate : defaultNameTemplate ,
Files : [ ] string {
"README.*" ,
} ,
FormatOverrides : [ ] config . FormatOverride {
{
Goos : "windows" ,
Format : "binary" ,
} ,
2018-03-17 03:52:04 +02:00
} ,
} ,
} ,
} ,
)
2018-07-09 05:54:42 +02:00
ctx . Git . CurrentTag = "v0.0.1"
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2018-03-17 03:52:04 +02:00
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "mybin" ,
Path : filepath . Join ( dist , "darwinamd64" , "mybin" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2018-03-17 03:52:04 +02:00
"Binary" : "mybin" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2018-03-17 03:52:04 +02:00
} ,
} )
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2018-03-17 03:52:04 +02:00
Goos : "windows" ,
Goarch : "amd64" ,
Name : "mybin.exe" ,
Path : filepath . Join ( dist , "windowsamd64" , "mybin.exe" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2018-03-17 03:52:04 +02:00
"Binary" : "mybin" ,
"Ext" : ".exe" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2018-03-17 03:52:04 +02:00
} ,
} )
ctx . Version = "0.0.1"
2019-04-16 15:19:15 +02:00
ctx . Config . Archives [ 0 ] . Format = format
2018-03-17 03:52:04 +02:00
2018-11-11 22:17:44 +02:00
require . NoError ( tt , Pipe { } . Run ( ctx ) )
2018-03-17 03:52:04 +02:00
var archives = ctx . Artifacts . Filter ( artifact . ByType ( artifact . UploadableArchive ) )
darwin := archives . Filter ( artifact . ByGoos ( "darwin" ) ) . List ( ) [ 0 ]
2018-11-11 22:17:44 +02:00
require . Equal ( tt , "foobar_0.0.1_darwin_amd64." + format , darwin . Name )
2019-06-10 15:35:19 +02:00
require . Equal ( tt , format , darwin . ExtraOr ( "Format" , "" ) )
2020-04-21 21:11:18 +02:00
require . Empty ( tt , darwin . ExtraOr ( "WrappedIn" , "" ) )
2018-03-17 03:52:04 +02:00
archives = ctx . Artifacts . Filter ( artifact . ByType ( artifact . UploadableBinary ) )
windows := archives . Filter ( artifact . ByGoos ( "windows" ) ) . List ( ) [ 0 ]
2018-11-11 22:17:44 +02:00
require . Equal ( tt , "foobar_0.0.1_windows_amd64.exe" , windows . Name )
2020-04-21 21:11:18 +02:00
require . Empty ( tt , windows . ExtraOr ( "WrappedIn" , "" ) )
2018-03-17 03:52:04 +02:00
} )
}
}
2018-11-11 16:11:03 +02:00
func TestRunPipeSameArchiveFilename ( t * testing . T ) {
folder , back := testlib . Mktmp ( t )
defer back ( )
var dist = filepath . Join ( folder , "dist" )
2018-11-11 22:17:44 +02:00
require . NoError ( t , os . Mkdir ( dist , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "darwinamd64" ) , 0755 ) )
require . NoError ( t , os . Mkdir ( filepath . Join ( dist , "windowsamd64" ) , 0755 ) )
2018-11-11 16:11:03 +02:00
_ , err := os . Create ( filepath . Join ( dist , "darwinamd64" , "mybin" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2018-11-11 16:11:03 +02:00
_ , err = os . Create ( filepath . Join ( dist , "windowsamd64" , "mybin.exe" ) )
2018-11-11 22:17:44 +02:00
require . NoError ( t , err )
2018-11-11 16:11:03 +02:00
var ctx = context . New (
config . Project {
Dist : dist ,
ProjectName : "foobar" ,
2019-04-16 15:19:15 +02:00
Archives : [ ] config . Archive {
{
Builds : [ ] string { "default" } ,
NameTemplate : "same-filename" ,
Files : [ ] string {
"README.*" ,
"./foo/**/*" ,
} ,
Format : "tar.gz" ,
2018-11-11 16:11:03 +02:00
} ,
} ,
} ,
)
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2018-11-11 16:11:03 +02:00
Goos : "darwin" ,
Goarch : "amd64" ,
Name : "mybin" ,
Path : filepath . Join ( dist , "darwinamd64" , "mybin" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2018-11-11 16:11:03 +02:00
"Binary" : "mybin" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2018-11-11 16:11:03 +02:00
} ,
} )
2019-08-12 22:44:48 +02:00
ctx . Artifacts . Add ( & artifact . Artifact {
2018-11-11 16:11:03 +02:00
Goos : "windows" ,
Goarch : "amd64" ,
Name : "mybin.exe" ,
Path : filepath . Join ( dist , "windowsamd64" , "mybin.exe" ) ,
Type : artifact . Binary ,
2019-01-01 18:40:17 +02:00
Extra : map [ string ] interface { } {
2018-11-11 16:11:03 +02:00
"Binary" : "mybin" ,
"Extension" : ".exe" ,
2019-04-16 15:19:15 +02:00
"ID" : "default" ,
2018-11-11 16:11:03 +02:00
} ,
} )
ctx . Version = "0.0.1"
ctx . Git . CurrentTag = "v0.0.1"
err = Pipe { } . Run ( ctx )
require . Error ( t , err )
require . Contains ( t , err . Error ( ) , "same-filename.tar.gz already exists. Check your archive name template" )
}
2018-11-11 23:02:45 +02:00
func TestDuplicateFilesInsideArchive ( t * testing . T ) {
f , err := ioutil . TempFile ( "" , "" )
require . NoError ( t , err )
defer f . Close ( )
defer os . Remove ( f . Name ( ) )
ff , err := ioutil . TempFile ( "" , "" )
require . NoError ( t , err )
defer ff . Close ( )
defer os . Remove ( ff . Name ( ) )
a := NewEnhancedArchive ( archive . New ( f ) , "" )
defer a . Close ( )
require . NoError ( t , a . Add ( "foo" , ff . Name ( ) ) )
require . EqualError ( t , a . Add ( "foo" , ff . Name ( ) ) , "file foo already exists in the archive" )
}
2018-11-13 17:48:16 +02:00
func TestWrapInDirectory ( t * testing . T ) {
t . Run ( "false" , func ( t * testing . T ) {
require . Equal ( t , "" , wrapFolder ( config . Archive {
WrapInDirectory : "false" ,
} ) )
} )
t . Run ( "true" , func ( t * testing . T ) {
require . Equal ( t , "foo" , wrapFolder ( config . Archive {
WrapInDirectory : "true" ,
NameTemplate : "foo" ,
} ) )
} )
t . Run ( "custom" , func ( t * testing . T ) {
require . Equal ( t , "foobar" , wrapFolder ( config . Archive {
WrapInDirectory : "foobar" ,
} ) )
} )
}
2019-04-16 15:19:15 +02:00
func TestSeveralArchivesWithTheSameID ( t * testing . T ) {
var ctx = & context . Context {
Config : config . Project {
Archives : [ ] config . Archive {
{
ID : "a" ,
} ,
{
ID : "a" ,
} ,
} ,
} ,
}
2019-07-27 15:55:56 +02:00
require . EqualError ( t , Pipe { } . Default ( ctx ) , "found 2 archives with the ID 'a', please fix your config" )
2019-04-16 15:19:15 +02:00
}