github.com/amane3/goreleaser@v0.182.0/internal/artifact/artifact_test.go (about)

     1  package artifact
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  	"golang.org/x/sync/errgroup"
    11  )
    12  
    13  // ensure Type implements the stringer interface...
    14  var _ fmt.Stringer = Type(0)
    15  
    16  func TestAdd(t *testing.T) {
    17  	var g errgroup.Group
    18  	var artifacts = New()
    19  	for _, a := range []*Artifact{
    20  		{
    21  			Name: "foo",
    22  			Type: UploadableArchive,
    23  		},
    24  		{
    25  			Name: "bar",
    26  			Type: Binary,
    27  		},
    28  		{
    29  			Name: "foobar",
    30  			Type: DockerImage,
    31  		},
    32  		{
    33  			Name: "check",
    34  			Type: Checksum,
    35  		},
    36  	} {
    37  		a := a
    38  		g.Go(func() error {
    39  			artifacts.Add(a)
    40  			return nil
    41  		})
    42  	}
    43  	require.NoError(t, g.Wait())
    44  	require.Len(t, artifacts.List(), 4)
    45  }
    46  
    47  func TestFilter(t *testing.T) {
    48  	var data = []*Artifact{
    49  		{
    50  			Name:   "foo",
    51  			Goos:   "linux",
    52  			Goarch: "arm",
    53  		},
    54  		{
    55  			Name:   "bar",
    56  			Goarch: "amd64",
    57  		},
    58  		{
    59  			Name:  "foobar",
    60  			Goarm: "6",
    61  		},
    62  		{
    63  			Name: "check",
    64  			Type: Checksum,
    65  		},
    66  		{
    67  			Name: "checkzumm",
    68  			Type: Checksum,
    69  		},
    70  	}
    71  	var artifacts = New()
    72  	for _, a := range data {
    73  		artifacts.Add(a)
    74  	}
    75  
    76  	require.Len(t, artifacts.Filter(ByGoos("linux")).items, 1)
    77  	require.Len(t, artifacts.Filter(ByGoos("darwin")).items, 0)
    78  
    79  	require.Len(t, artifacts.Filter(ByGoarch("amd64")).items, 1)
    80  	require.Len(t, artifacts.Filter(ByGoarch("386")).items, 0)
    81  
    82  	require.Len(t, artifacts.Filter(ByGoarm("6")).items, 1)
    83  	require.Len(t, artifacts.Filter(ByGoarm("7")).items, 0)
    84  
    85  	require.Len(t, artifacts.Filter(ByType(Checksum)).items, 2)
    86  	require.Len(t, artifacts.Filter(ByType(Binary)).items, 0)
    87  
    88  	require.Len(t, artifacts.Filter(nil).items, 5)
    89  
    90  	require.Len(t, artifacts.Filter(
    91  		And(
    92  			ByType(Checksum),
    93  			func(a *Artifact) bool {
    94  				return a.Name == "checkzumm"
    95  			},
    96  		),
    97  	).List(), 1)
    98  
    99  	require.Len(t, artifacts.Filter(
   100  		Or(
   101  			ByType(Checksum),
   102  			And(
   103  				ByGoos("linux"),
   104  				ByGoarm("arm"),
   105  			),
   106  		),
   107  	).List(), 2)
   108  }
   109  
   110  func TestGroupByPlatform(t *testing.T) {
   111  	var data = []*Artifact{
   112  		{
   113  			Name:   "foo",
   114  			Goos:   "linux",
   115  			Goarch: "amd64",
   116  		},
   117  		{
   118  			Name:   "bar",
   119  			Goos:   "linux",
   120  			Goarch: "amd64",
   121  		},
   122  		{
   123  			Name:   "foobar",
   124  			Goos:   "linux",
   125  			Goarch: "arm",
   126  			Goarm:  "6",
   127  		},
   128  		{
   129  			Name:   "foobar",
   130  			Goos:   "linux",
   131  			Goarch: "mips",
   132  			Goarm:  "softfloat",
   133  		},
   134  		{
   135  			Name:   "foobar",
   136  			Goos:   "linux",
   137  			Goarch: "mips",
   138  			Goarm:  "hardfloat",
   139  		},
   140  		{
   141  			Name: "check",
   142  			Type: Checksum,
   143  		},
   144  	}
   145  	var artifacts = New()
   146  	for _, a := range data {
   147  		artifacts.Add(a)
   148  	}
   149  
   150  	var groups = artifacts.GroupByPlatform()
   151  	require.Len(t, groups["linuxamd64"], 2)
   152  	require.Len(t, groups["linuxarm6"], 1)
   153  	require.Len(t, groups["linuxmipssoftfloat"], 1)
   154  	require.Len(t, groups["linuxmipshardfloat"], 1)
   155  }
   156  
   157  func TestChecksum(t *testing.T) {
   158  	var folder = t.TempDir()
   159  	var file = filepath.Join(folder, "subject")
   160  	require.NoError(t, ioutil.WriteFile(file, []byte("lorem ipsum"), 0644))
   161  
   162  	var artifact = Artifact{
   163  		Path: file,
   164  	}
   165  
   166  	for algo, result := range map[string]string{
   167  		"sha256": "5e2bf57d3f40c4b6df69daf1936cb766f832374b4fc0259a7cbff06e2f70f269",
   168  		"sha512": "f80eebd9aabb1a15fb869ed568d858a5c0dca3d5da07a410e1bd988763918d973e344814625f7c844695b2de36ffd27af290d0e34362c51dee5947d58d40527a",
   169  		"sha1":   "bfb7759a67daeb65410490b4d98bb9da7d1ea2ce",
   170  		"crc32":  "72d7748e",
   171  		"md5":    "80a751fde577028640c419000e33eba6",
   172  		"sha224": "e191edf06005712583518ced92cc2ac2fac8d6e4623b021a50736a91",
   173  		"sha384": "597493a6cf1289757524e54dfd6f68b332c7214a716a3358911ef5c09907adc8a654a18c1d721e183b0025f996f6e246",
   174  	} {
   175  		t.Run(algo, func(t *testing.T) {
   176  			sum, err := artifact.Checksum(algo)
   177  			require.NoError(t, err)
   178  			require.Equal(t, result, sum)
   179  		})
   180  	}
   181  }
   182  
   183  func TestChecksumFileDoesntExist(t *testing.T) {
   184  	var artifact = Artifact{
   185  		Path: "/tmp/adasdasdas/asdasd/asdas",
   186  	}
   187  	sum, err := artifact.Checksum("sha1")
   188  	require.EqualError(t, err, `failed to checksum: open /tmp/adasdasdas/asdasd/asdas: no such file or directory`)
   189  	require.Empty(t, sum)
   190  }
   191  
   192  func TestInvalidAlgorithm(t *testing.T) {
   193  	f, err := ioutil.TempFile(t.TempDir(), "")
   194  	require.NoError(t, err)
   195  	t.Cleanup(func() { f.Close() })
   196  	var artifact = Artifact{
   197  		Path: f.Name(),
   198  	}
   199  	sum, err := artifact.Checksum("sha1ssss")
   200  	require.EqualError(t, err, `invalid algorithm: sha1ssss`)
   201  	require.Empty(t, sum)
   202  }
   203  
   204  func TestExtraOr(t *testing.T) {
   205  	var a = &Artifact{
   206  		Extra: map[string]interface{}{
   207  			"Foo": "foo",
   208  		},
   209  	}
   210  	require.Equal(t, "foo", a.ExtraOr("Foo", "bar"))
   211  	require.Equal(t, "bar", a.ExtraOr("Foobar", "bar"))
   212  }
   213  
   214  func TestByIDs(t *testing.T) {
   215  	var data = []*Artifact{
   216  		{
   217  			Name: "foo",
   218  			Extra: map[string]interface{}{
   219  				"ID": "foo",
   220  			},
   221  		},
   222  		{
   223  			Name: "bar",
   224  			Extra: map[string]interface{}{
   225  				"ID": "bar",
   226  			},
   227  		},
   228  		{
   229  			Name: "foobar",
   230  			Extra: map[string]interface{}{
   231  				"ID": "foo",
   232  			},
   233  		},
   234  		{
   235  			Name: "check",
   236  			Extra: map[string]interface{}{
   237  				"ID": "check",
   238  			},
   239  		},
   240  		{
   241  			Name: "checksum",
   242  			Type: Checksum,
   243  		},
   244  	}
   245  	var artifacts = New()
   246  	for _, a := range data {
   247  		artifacts.Add(a)
   248  	}
   249  
   250  	require.Len(t, artifacts.Filter(ByIDs("check")).items, 2)
   251  	require.Len(t, artifacts.Filter(ByIDs("foo")).items, 3)
   252  	require.Len(t, artifacts.Filter(ByIDs("foo", "bar")).items, 4)
   253  }
   254  
   255  func TestByFormats(t *testing.T) {
   256  	var data = []*Artifact{
   257  		{
   258  			Name: "foo",
   259  			Extra: map[string]interface{}{
   260  				"Format": "zip",
   261  			},
   262  		},
   263  		{
   264  			Name: "bar",
   265  			Extra: map[string]interface{}{
   266  				"Format": "tar.gz",
   267  			},
   268  		},
   269  		{
   270  			Name: "foobar",
   271  			Extra: map[string]interface{}{
   272  				"Format": "zip",
   273  			},
   274  		},
   275  		{
   276  			Name: "bin",
   277  			Extra: map[string]interface{}{
   278  				"Format": "binary",
   279  			},
   280  		},
   281  	}
   282  	var artifacts = New()
   283  	for _, a := range data {
   284  		artifacts.Add(a)
   285  	}
   286  
   287  	require.Len(t, artifacts.Filter(ByFormats("binary")).items, 1)
   288  	require.Len(t, artifacts.Filter(ByFormats("zip")).items, 2)
   289  	require.Len(t, artifacts.Filter(ByFormats("zip", "tar.gz")).items, 3)
   290  }
   291  
   292  func TestTypeToString(t *testing.T) {
   293  	for _, a := range []Type{
   294  		UploadableArchive,
   295  		UploadableBinary,
   296  		UploadableFile,
   297  		Binary,
   298  		LinuxPackage,
   299  		PublishableSnapcraft,
   300  		Snapcraft,
   301  		PublishableDockerImage,
   302  		DockerImage,
   303  		DockerManifest,
   304  		Checksum,
   305  		Signature,
   306  		UploadableSourceArchive,
   307  	} {
   308  		t.Run(a.String(), func(t *testing.T) {
   309  			require.NotEqual(t, "unknown", a.String())
   310  		})
   311  	}
   312  	t.Run("unknown", func(t *testing.T) {
   313  		require.Equal(t, "unknown", Type(9999).String())
   314  	})
   315  }