github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/genny/build/bin_test.go (about)

     1  package build
     2  
     3  import (
     4  	"os/exec"
     5  	"path/filepath"
     6  	"runtime"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/gobuffalo/envy"
    11  	"github.com/gobuffalo/meta"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func appBinaryFolder() string {
    16  	prefix := "." + string(filepath.Separator)
    17  	path := filepath.Join("cmd", "app")
    18  
    19  	return prefix + path
    20  }
    21  
    22  func Test_buildCmd(t *testing.T) {
    23  	envy.Set("GO_BIN", "go")
    24  	r := require.New(t)
    25  
    26  	eq := func(s string, c *exec.Cmd) {
    27  		if runtime.GOOS == "windows" {
    28  			s = strings.Replace(s, "bin/build", `bin\build.exe`, 1)
    29  			s = strings.Replace(s, "bin/foo", `bin\foo.exe`, 1)
    30  		}
    31  		r.Equal(s, strings.Join(c.Args, " "))
    32  	}
    33  
    34  	opts := &Options{
    35  		App:       meta.New("."),
    36  		GoCommand: "build",
    37  	}
    38  	c, err := buildCmd(opts)
    39  	r.NoError(err)
    40  	eq("go build -o bin/build "+appBinaryFolder(), c)
    41  
    42  	opts.Environment = "bar"
    43  	c, err = buildCmd(opts)
    44  	r.NoError(err)
    45  	eq("go build -tags bar -o bin/build "+appBinaryFolder(), c)
    46  
    47  	opts.App.Bin = "bin/foo"
    48  	c, err = buildCmd(opts)
    49  	r.NoError(err)
    50  	eq("go build -tags bar -o bin/foo "+appBinaryFolder(), c)
    51  
    52  	opts.WithSQLite = true
    53  	c, err = buildCmd(opts)
    54  	r.NoError(err)
    55  	eq("go build -tags bar sqlite -o bin/foo "+appBinaryFolder(), c)
    56  
    57  	opts.LDFlags = "-X foo.Bar=baz"
    58  	c, err = buildCmd(opts)
    59  	r.NoError(err)
    60  	eq("go build -tags bar sqlite -o bin/foo -ldflags -X foo.Bar=baz "+appBinaryFolder(), c)
    61  
    62  	opts.Static = true
    63  	c, err = buildCmd(opts)
    64  	r.NoError(err)
    65  	eq("go build -tags bar sqlite -o bin/foo -ldflags -linkmode external -extldflags \"-static\" -X foo.Bar=baz "+appBinaryFolder(), c)
    66  
    67  	opts.LDFlags = "-X main.BuildTime=asdf"
    68  	c, err = buildCmd(opts)
    69  	r.NoError(err)
    70  	eq("go build -tags bar sqlite -o bin/foo -ldflags -linkmode external -extldflags \"-static\" -X main.BuildTime=asdf "+appBinaryFolder(), c)
    71  
    72  	opts.LDFlags = "-X main.BuildVersion=asdf"
    73  	c, err = buildCmd(opts)
    74  	r.NoError(err)
    75  	eq("go build -tags bar sqlite -o bin/foo -ldflags -linkmode external -extldflags \"-static\" -X main.BuildVersion=asdf "+appBinaryFolder(), c)
    76  }
    77  
    78  func Test_buildCmd_Unix_RemovesExe(t *testing.T) {
    79  	if runtime.GOOS == "windows" {
    80  		return
    81  	}
    82  	envy.Set("GO_BIN", "go")
    83  	r := require.New(t)
    84  
    85  	eq := func(s string, c *exec.Cmd) {
    86  		r.Equal(s, strings.Join(c.Args, " "))
    87  	}
    88  	app := meta.New(".")
    89  	app.Bin = "bin/build.exe"
    90  	opts := &Options{
    91  		App:       app,
    92  		GoCommand: "build",
    93  	}
    94  	c, err := buildCmd(opts)
    95  	r.NoError(err)
    96  	eq("go build -o bin/build "+appBinaryFolder(), c)
    97  }
    98  
    99  func Test_buildCmd_Windows_AddsExe(t *testing.T) {
   100  	if runtime.GOOS != "windows" {
   101  		return
   102  	}
   103  	envy.Set("GO_BIN", "go")
   104  	r := require.New(t)
   105  
   106  	eq := func(s string, c *exec.Cmd) {
   107  		r.Equal(s, strings.Join(c.Args, " "))
   108  	}
   109  
   110  	app := meta.New(".")
   111  	for _, x := range []string{"bin\\build", "bin\\build.exe"} {
   112  		app.Bin = x
   113  		opts := &Options{
   114  			App: app,
   115  		}
   116  		c, err := buildCmd(opts)
   117  		r.NoError(err)
   118  		eq("go build -o bin\\build.exe "+appBinaryFolder(), c)
   119  	}
   120  }
   121  
   122  func Test_installCmd(t *testing.T) {
   123  	envy.Set("GO_BIN", "go")
   124  	r := require.New(t)
   125  
   126  	eq := func(s string, c *exec.Cmd) {
   127  		if runtime.GOOS == "windows" {
   128  			s = strings.Replace(s, "bin/build", `bin\build.exe`, 1)
   129  			s = strings.Replace(s, "bin/foo", `bin\foo.exe`, 1)
   130  		}
   131  		r.Equal(s, strings.Join(c.Args, " "))
   132  	}
   133  
   134  	opts := &Options{
   135  		App:       meta.New("."),
   136  		GoCommand: "install",
   137  	}
   138  	c, err := buildCmd(opts)
   139  	r.NoError(err)
   140  	eq("go install "+appBinaryFolder(), c)
   141  
   142  	opts.Environment = "bar"
   143  	c, err = buildCmd(opts)
   144  	r.NoError(err)
   145  	eq("go install -tags bar "+appBinaryFolder(), c)
   146  
   147  	opts.App.Bin = "bin/foo"
   148  	c, err = buildCmd(opts)
   149  	r.NoError(err)
   150  	eq("go install -tags bar "+appBinaryFolder(), c)
   151  
   152  	opts.WithSQLite = true
   153  	c, err = buildCmd(opts)
   154  	r.NoError(err)
   155  	eq("go install -tags bar sqlite "+appBinaryFolder(), c)
   156  
   157  	opts.LDFlags = "-X foo.Bar=baz"
   158  	c, err = buildCmd(opts)
   159  	r.NoError(err)
   160  	eq("go install -tags bar sqlite -ldflags -X foo.Bar=baz "+appBinaryFolder(), c)
   161  
   162  	opts.Static = true
   163  	c, err = buildCmd(opts)
   164  	r.NoError(err)
   165  	eq("go install -tags bar sqlite -ldflags -linkmode external -extldflags \"-static\" -X foo.Bar=baz "+appBinaryFolder(), c)
   166  
   167  	opts.LDFlags = "-X main.BuildTime=asdf"
   168  	c, err = buildCmd(opts)
   169  	r.NoError(err)
   170  	eq("go install -tags bar sqlite -ldflags -linkmode external -extldflags \"-static\" -X main.BuildTime=asdf "+appBinaryFolder(), c)
   171  
   172  	opts.LDFlags = "-X main.BuildVersion=asdf"
   173  	c, err = buildCmd(opts)
   174  	r.NoError(err)
   175  	eq("go install -tags bar sqlite -ldflags -linkmode external -extldflags \"-static\" -X main.BuildVersion=asdf "+appBinaryFolder(), c)
   176  }