github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/pipe/checksums/checksums_test.go (about) 1 package checksums 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/goreleaser/goreleaser/internal/artifact" 10 "github.com/goreleaser/goreleaser/pkg/config" 11 "github.com/goreleaser/goreleaser/pkg/context" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestDescription(t *testing.T) { 16 require.NotEmpty(t, Pipe{}.String()) 17 } 18 19 func TestPipe(t *testing.T) { 20 const binary = "binary" 21 const archive = binary + ".tar.gz" 22 const linuxPackage = binary + ".rpm" 23 const checksums = binary + "_bar_checksums.txt" 24 25 tests := map[string]struct { 26 ids []string 27 want []string 28 }{ 29 "default": { 30 want: []string{ 31 binary, 32 archive, 33 linuxPackage, 34 }, 35 }, 36 "select ids": { 37 ids: []string{ 38 "id-1", 39 "id-2", 40 }, 41 want: []string{ 42 binary, 43 archive, 44 }, 45 }, 46 } 47 for name, tt := range tests { 48 t.Run(name, func(t *testing.T) { 49 folder := t.TempDir() 50 file := filepath.Join(folder, binary) 51 require.NoError(t, os.WriteFile(file, []byte("some string"), 0o644)) 52 ctx := context.New( 53 config.Project{ 54 Dist: folder, 55 ProjectName: binary, 56 Checksum: config.Checksum{ 57 NameTemplate: "{{ .ProjectName }}_{{ .Env.FOO }}_checksums.txt", 58 Algorithm: "sha256", 59 IDs: tt.ids, 60 }, 61 }, 62 ) 63 ctx.Git.CurrentTag = "1.2.3" 64 ctx.Env = map[string]string{"FOO": "bar"} 65 ctx.Artifacts.Add(&artifact.Artifact{ 66 Name: binary, 67 Path: file, 68 Type: artifact.UploadableBinary, 69 Extra: map[string]interface{}{ 70 "ID": "id-1", 71 }, 72 }) 73 ctx.Artifacts.Add(&artifact.Artifact{ 74 Name: archive, 75 Path: file, 76 Type: artifact.UploadableArchive, 77 Extra: map[string]interface{}{ 78 "ID": "id-2", 79 }, 80 }) 81 ctx.Artifacts.Add(&artifact.Artifact{ 82 Name: linuxPackage, 83 Path: file, 84 Type: artifact.LinuxPackage, 85 Extra: map[string]interface{}{ 86 "ID": "id-3", 87 }, 88 }) 89 require.NoError(t, Pipe{}.Run(ctx)) 90 var artifacts []string 91 for _, a := range ctx.Artifacts.List() { 92 artifacts = append(artifacts, a.Name) 93 } 94 require.Contains(t, artifacts, checksums, binary) 95 bts, err := os.ReadFile(filepath.Join(folder, checksums)) 96 require.NoError(t, err) 97 for _, want := range tt.want { 98 require.Contains(t, string(bts), "61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc "+want) 99 } 100 }) 101 } 102 } 103 104 func TestPipeFileNotExist(t *testing.T) { 105 folder := t.TempDir() 106 ctx := context.New( 107 config.Project{ 108 Dist: folder, 109 Checksum: config.Checksum{ 110 NameTemplate: "checksums.txt", 111 }, 112 }, 113 ) 114 ctx.Git.CurrentTag = "1.2.3" 115 ctx.Artifacts.Add(&artifact.Artifact{ 116 Name: "nope", 117 Path: "/nope", 118 Type: artifact.UploadableBinary, 119 }) 120 err := Pipe{}.Run(ctx) 121 require.Error(t, err) 122 require.Contains(t, err.Error(), "/nope: no such file or directory") 123 } 124 125 func TestPipeInvalidNameTemplate(t *testing.T) { 126 binFile, err := ioutil.TempFile(t.TempDir(), "goreleasertest-bin") 127 require.NoError(t, err) 128 t.Cleanup(func() { require.NoError(t, binFile.Close()) }) 129 _, err = binFile.WriteString("fake artifact") 130 require.NoError(t, err) 131 132 for template, eerr := range map[string]string{ 133 "{{ .Pro }_checksums.txt": `template: tmpl:1: unexpected "}" in operand`, 134 "{{.Env.NOPE}}": `template: tmpl:1:6: executing "tmpl" at <.Env.NOPE>: map has no entry for key "NOPE"`, 135 } { 136 t.Run(template, func(t *testing.T) { 137 folder := t.TempDir() 138 ctx := context.New( 139 config.Project{ 140 Dist: folder, 141 ProjectName: "name", 142 Checksum: config.Checksum{ 143 NameTemplate: template, 144 Algorithm: "sha256", 145 }, 146 }, 147 ) 148 ctx.Git.CurrentTag = "1.2.3" 149 ctx.Artifacts.Add(&artifact.Artifact{ 150 Name: "whatever", 151 Type: artifact.UploadableBinary, 152 Path: binFile.Name(), 153 }) 154 err = Pipe{}.Run(ctx) 155 require.Error(t, err) 156 require.Equal(t, eerr, err.Error()) 157 }) 158 } 159 } 160 161 func TestPipeCouldNotOpenChecksumsTxt(t *testing.T) { 162 folder := t.TempDir() 163 binFile, err := ioutil.TempFile(folder, "goreleasertest-bin") 164 require.NoError(t, err) 165 t.Cleanup(func() { require.NoError(t, binFile.Close()) }) 166 _, err = binFile.WriteString("fake artifact") 167 require.NoError(t, err) 168 169 file := filepath.Join(folder, "checksums.txt") 170 require.NoError(t, os.WriteFile(file, []byte("some string"), 0o000)) 171 ctx := context.New( 172 config.Project{ 173 Dist: folder, 174 Checksum: config.Checksum{ 175 NameTemplate: "checksums.txt", 176 Algorithm: "sha256", 177 }, 178 }, 179 ) 180 ctx.Git.CurrentTag = "1.2.3" 181 ctx.Artifacts.Add(&artifact.Artifact{ 182 Name: "whatever", 183 Type: artifact.UploadableBinary, 184 Path: binFile.Name(), 185 }) 186 err = Pipe{}.Run(ctx) 187 require.Error(t, err) 188 require.Contains(t, err.Error(), "/checksums.txt: permission denied") 189 } 190 191 func TestPipeWhenNoArtifacts(t *testing.T) { 192 ctx := &context.Context{} 193 require.NoError(t, Pipe{}.Run(ctx)) 194 require.Len(t, ctx.Artifacts.List(), 0) 195 } 196 197 func TestDefault(t *testing.T) { 198 ctx := &context.Context{ 199 Config: config.Project{ 200 Checksum: config.Checksum{}, 201 }, 202 } 203 require.NoError(t, Pipe{}.Default(ctx)) 204 require.Equal( 205 t, 206 "{{ .ProjectName }}_{{ .Version }}_checksums.txt", 207 ctx.Config.Checksum.NameTemplate, 208 ) 209 require.Equal(t, "sha256", ctx.Config.Checksum.Algorithm) 210 } 211 212 func TestDefaultSet(t *testing.T) { 213 ctx := &context.Context{ 214 Config: config.Project{ 215 Checksum: config.Checksum{ 216 NameTemplate: "checksums.txt", 217 }, 218 }, 219 } 220 require.NoError(t, Pipe{}.Default(ctx)) 221 require.Equal(t, "checksums.txt", ctx.Config.Checksum.NameTemplate) 222 } 223 224 func TestPipeCheckSumsWithExtraFiles(t *testing.T) { 225 const binary = "binary" 226 const checksums = "checksums.txt" 227 const extraFileFooRelPath = "./testdata/foo.txt" 228 const extraFileBarRelPath = "./testdata/**/bar.txt" 229 const extraFileFoo = "foo.txt" 230 const extraFileBar = "bar.txt" 231 232 tests := map[string]struct { 233 extraFiles []config.ExtraFile 234 want []string 235 }{ 236 "default": { 237 extraFiles: nil, 238 want: []string{ 239 binary, 240 }, 241 }, 242 "one extra file": { 243 extraFiles: []config.ExtraFile{ 244 {Glob: extraFileFooRelPath}, 245 }, 246 want: []string{ 247 extraFileFoo, 248 }, 249 }, 250 "multiple extra files": { 251 extraFiles: []config.ExtraFile{ 252 {Glob: extraFileFooRelPath}, 253 {Glob: extraFileBarRelPath}, 254 }, 255 want: []string{ 256 extraFileFoo, 257 extraFileBar, 258 }, 259 }, 260 } 261 262 for name, tt := range tests { 263 t.Run(name, func(t *testing.T) { 264 folder := t.TempDir() 265 file := filepath.Join(folder, binary) 266 require.NoError(t, os.WriteFile(file, []byte("some string"), 0o644)) 267 ctx := context.New( 268 config.Project{ 269 Dist: folder, 270 ProjectName: binary, 271 Checksum: config.Checksum{ 272 Algorithm: "sha256", 273 NameTemplate: "checksums.txt", 274 ExtraFiles: tt.extraFiles, 275 }, 276 }, 277 ) 278 279 ctx.Artifacts.Add(&artifact.Artifact{ 280 Name: binary, 281 Path: file, 282 Type: artifact.UploadableBinary, 283 Extra: map[string]interface{}{ 284 "ID": "id-1", 285 }, 286 }) 287 288 require.NoError(t, Pipe{}.Run(ctx)) 289 290 bts, err := os.ReadFile(filepath.Join(folder, checksums)) 291 292 require.NoError(t, err) 293 for _, want := range tt.want { 294 if tt.extraFiles == nil { 295 require.Contains(t, string(bts), "61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc "+want) 296 } else { 297 require.Contains(t, string(bts), "3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 "+want) 298 } 299 } 300 }) 301 } 302 } 303 304 func TestExtraFilesNoMatch(t *testing.T) { 305 dir := t.TempDir() 306 ctx := context.New( 307 config.Project{ 308 Dist: dir, 309 ProjectName: "fake", 310 Checksum: config.Checksum{ 311 Algorithm: "sha256", 312 NameTemplate: "checksums.txt", 313 ExtraFiles: []config.ExtraFile{{Glob: "./nope/nope.txt"}}, 314 }, 315 }, 316 ) 317 318 ctx.Artifacts.Add(&artifact.Artifact{ 319 Name: "fake", 320 Path: "fake-path", 321 Type: artifact.UploadableBinary, 322 }) 323 324 require.NoError(t, Pipe{}.Default(ctx)) 325 require.EqualError(t, Pipe{}.Run(ctx), `globbing failed for pattern ./nope/nope.txt: matching "./nope/nope.txt": file does not exist`) 326 } 327 328 func TestSkip(t *testing.T) { 329 t.Run("skip", func(t *testing.T) { 330 ctx := context.New(config.Project{ 331 Checksum: config.Checksum{ 332 Disable: true, 333 }, 334 }) 335 require.True(t, Pipe{}.Skip(ctx)) 336 }) 337 338 t.Run("dont skip", func(t *testing.T) { 339 require.False(t, Pipe{}.Skip(context.New(config.Project{}))) 340 }) 341 } 342 343 // TODO: add tests for LinuxPackage and UploadableSourceArchive