github.com/triarius/goreleaser@v1.12.5/internal/pipe/gomod/gomod_proxy_test.go (about) 1 package gomod 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "runtime" 8 "testing" 9 10 "github.com/triarius/goreleaser/internal/testlib" 11 "github.com/triarius/goreleaser/pkg/config" 12 "github.com/triarius/goreleaser/pkg/context" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestGoModProxy(t *testing.T) { 17 t.Run("goreleaser", func(t *testing.T) { 18 dir := testlib.Mktmp(t) 19 dist := filepath.Join(dir, "dist") 20 ctx := context.New(config.Project{ 21 Dist: dist, 22 GoMod: config.GoMod{ 23 Proxy: true, 24 GoBinary: "go", 25 }, 26 Builds: []config.Build{ 27 { 28 ID: "foo", 29 Goos: []string{runtime.GOOS}, 30 Goarch: []string{runtime.GOARCH}, 31 Main: ".", 32 Dir: ".", 33 }, 34 }, 35 }) 36 ctx.Git.CurrentTag = "v0.161.1" 37 38 ctx.ModulePath = "github.com/triarius/goreleaser" 39 40 fakeGoModAndSum(t, ctx.ModulePath) 41 require.NoError(t, ProxyPipe{}.Run(ctx)) 42 requireGoMod(t, ctx.ModulePath, ctx.Git.CurrentTag) 43 requireMainGo(t, ctx.ModulePath) 44 require.Equal(t, ctx.ModulePath, ctx.Config.Builds[0].Main) 45 require.Equal(t, ".", ctx.Config.Builds[0].UnproxiedMain) 46 require.Equal(t, filepath.Join(dist, "proxy", "foo"), ctx.Config.Builds[0].Dir) 47 require.Equal(t, ".", ctx.Config.Builds[0].UnproxiedDir) 48 49 require.Equal(t, ctx.ModulePath, ctx.ModulePath) 50 }) 51 52 t.Run("nfpm", func(t *testing.T) { 53 dir := testlib.Mktmp(t) 54 dist := filepath.Join(dir, "dist") 55 ctx := context.New(config.Project{ 56 Dist: dist, 57 GoMod: config.GoMod{ 58 Proxy: true, 59 GoBinary: "go", 60 }, 61 Builds: []config.Build{ 62 { 63 ID: "foo", 64 Goos: []string{runtime.GOOS}, 65 Goarch: []string{runtime.GOARCH}, 66 Main: "./cmd/nfpm", 67 }, 68 }, 69 }) 70 ctx.Git.CurrentTag = "v2.3.1" 71 72 ctx.ModulePath = "github.com/goreleaser/nfpm/v2" 73 fakeGoModAndSum(t, ctx.ModulePath) 74 require.NoError(t, ProxyPipe{}.Run(ctx)) 75 requireGoMod(t, ctx.ModulePath, ctx.Git.CurrentTag) 76 requireMainGo(t, ctx.ModulePath+"/cmd/nfpm") 77 require.Equal(t, ctx.ModulePath+"/cmd/nfpm", ctx.Config.Builds[0].Main) 78 require.Equal(t, filepath.Join(dist, "proxy", "foo"), ctx.Config.Builds[0].Dir) 79 require.Equal(t, ctx.ModulePath, ctx.ModulePath) 80 }) 81 82 // this repo does not have a go.sum file, which is ok, a project might not have any dependencies 83 t.Run("no go.sum", func(t *testing.T) { 84 dir := testlib.Mktmp(t) 85 dist := filepath.Join(dir, "dist") 86 ctx := context.New(config.Project{ 87 Dist: dist, 88 GoMod: config.GoMod{ 89 Proxy: true, 90 GoBinary: "go", 91 }, 92 Builds: []config.Build{ 93 { 94 ID: "foo", 95 Goos: []string{runtime.GOOS}, 96 Goarch: []string{runtime.GOARCH}, 97 }, 98 }, 99 }) 100 ctx.Git.CurrentTag = "v0.0.1" 101 102 ctx.ModulePath = "github.com/goreleaser/example-mod-proxy" 103 fakeGoMod(t, ctx.ModulePath) 104 require.NoError(t, ProxyPipe{}.Run(ctx)) 105 requireGoMod(t, ctx.ModulePath, ctx.Git.CurrentTag) 106 requireMainGo(t, ctx.ModulePath) 107 require.Equal(t, ctx.ModulePath, ctx.Config.Builds[0].Main) 108 require.Equal(t, filepath.Join(dist, "proxy", "foo"), ctx.Config.Builds[0].Dir) 109 require.Equal(t, ctx.ModulePath, ctx.ModulePath) 110 }) 111 112 t.Run("no perms", func(t *testing.T) { 113 for file, mode := range map[string]os.FileMode{ 114 "go.mod": 0o500, 115 "go.sum": 0o500, 116 "main.go": 0o500, 117 "../../../go.sum": 0o300, 118 } { 119 t.Run(file, func(t *testing.T) { 120 dir := testlib.Mktmp(t) 121 dist := filepath.Join(dir, "dist") 122 ctx := context.New(config.Project{ 123 Dist: dist, 124 GoMod: config.GoMod{ 125 Proxy: true, 126 GoBinary: "go", 127 }, 128 Builds: []config.Build{ 129 { 130 ID: "foo", 131 Goos: []string{runtime.GOOS}, 132 Goarch: []string{runtime.GOARCH}, 133 }, 134 }, 135 }) 136 ctx.Git.CurrentTag = "v0.161.1" 137 138 ctx.ModulePath = "github.com/triarius/goreleaser" 139 140 fakeGoModAndSum(t, ctx.ModulePath) 141 require.NoError(t, ProxyPipe{}.Run(ctx)) // should succeed at first 142 143 // change perms of a file and run again, which should now fail on that file. 144 require.NoError(t, os.Chmod(filepath.Join(dist, "proxy", "foo", file), mode)) 145 require.ErrorAs(t, ProxyPipe{}.Run(ctx), &ErrProxy{}) 146 }) 147 } 148 }) 149 150 t.Run("goreleaser with main.go", func(t *testing.T) { 151 dir := testlib.Mktmp(t) 152 dist := filepath.Join(dir, "dist") 153 ctx := context.New(config.Project{ 154 Dist: dist, 155 GoMod: config.GoMod{ 156 Proxy: true, 157 GoBinary: "go", 158 }, 159 Builds: []config.Build{ 160 { 161 ID: "foo", 162 Goos: []string{runtime.GOOS}, 163 Goarch: []string{runtime.GOARCH}, 164 Main: "main.go", 165 }, 166 }, 167 }) 168 ctx.Git.CurrentTag = "v0.161.1" 169 170 ctx.ModulePath = "github.com/triarius/goreleaser" 171 172 fakeGoModAndSum(t, ctx.ModulePath) 173 require.NoError(t, ProxyPipe{}.Run(ctx)) 174 requireGoMod(t, ctx.ModulePath, ctx.Git.CurrentTag) 175 requireMainGo(t, ctx.ModulePath) 176 require.Equal(t, ctx.ModulePath, ctx.Config.Builds[0].Main) 177 require.Equal(t, filepath.Join(dist, "proxy", "foo"), ctx.Config.Builds[0].Dir) 178 require.Equal(t, ctx.ModulePath, ctx.ModulePath) 179 }) 180 } 181 182 func TestProxyDescription(t *testing.T) { 183 require.NotEmpty(t, ProxyPipe{}.String()) 184 } 185 186 func TestSkip(t *testing.T) { 187 t.Run("skip false gomod.proxy", func(t *testing.T) { 188 require.True(t, ProxyPipe{}.Skip(context.New(config.Project{}))) 189 }) 190 191 t.Run("skip snapshot", func(t *testing.T) { 192 ctx := context.New(config.Project{ 193 GoMod: config.GoMod{ 194 Proxy: true, 195 }, 196 }) 197 ctx.ModulePath = "github.com/triarius/goreleaser" 198 ctx.Snapshot = true 199 require.True(t, ProxyPipe{}.Skip(ctx)) 200 }) 201 202 t.Run("skip not a go module", func(t *testing.T) { 203 ctx := context.New(config.Project{ 204 GoMod: config.GoMod{ 205 Proxy: true, 206 }, 207 }) 208 ctx.ModulePath = "" 209 require.True(t, ProxyPipe{}.Skip(ctx)) 210 }) 211 212 t.Run("dont skip", func(t *testing.T) { 213 ctx := context.New(config.Project{ 214 GoMod: config.GoMod{ 215 Proxy: true, 216 }, 217 }) 218 ctx.ModulePath = "github.com/triarius/goreleaser" 219 require.False(t, ProxyPipe{}.Skip(ctx)) 220 }) 221 } 222 223 func requireGoMod(tb testing.TB, module, version string) { 224 tb.Helper() 225 226 mod, err := os.ReadFile("dist/proxy/foo/go.mod") 227 require.NoError(tb, err) 228 require.Contains(tb, string(mod), fmt.Sprintf(`module foo 229 230 go 1.19 231 232 require %s %s 233 `, module, version)) 234 } 235 236 func requireMainGo(tb testing.TB, module string) { 237 tb.Helper() 238 239 main, err := os.ReadFile("dist/proxy/foo/main.go") 240 require.NoError(tb, err) 241 require.Equal(tb, fmt.Sprintf(` 242 // +build main 243 package main 244 245 import _ "%s" 246 `, module), string(main)) 247 } 248 249 func fakeGoModAndSum(tb testing.TB, module string) { 250 tb.Helper() 251 252 fakeGoMod(tb, module) 253 require.NoError(tb, os.WriteFile("go.sum", []byte("\n"), 0o666)) 254 } 255 256 func fakeGoMod(tb testing.TB, module string) { 257 tb.Helper() 258 require.NoError(tb, os.WriteFile("go.mod", []byte(fmt.Sprintf("module %s\n", module)), 0o666)) 259 }