github.com/tiagovtristao/plz@v13.4.0+incompatible/src/core/config_test.go (about)

     1  package core
     2  
     3  import (
     4  	"bytes"
     5  	"os"
     6  	"runtime"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/jessevdk/go-flags"
    11  	"github.com/stretchr/testify/assert"
    12  
    13  	"github.com/thought-machine/please/src/cli"
    14  	"reflect"
    15  	"strings"
    16  )
    17  
    18  func TestPlzConfigWorking(t *testing.T) {
    19  	config, err := ReadConfigFiles([]string{"src/core/test_data/working.plzconfig"}, "")
    20  	assert.NoError(t, err)
    21  	assert.Equal(t, "pexmabob", config.Python.PexTool)
    22  	assert.Equal(t, "javac", config.Java.JavacTool)
    23  	assert.Equal(t, "jlink", config.Java.JlinkTool)
    24  	assert.Equal(t, "/path/to/java/home", config.Java.JavaHome)
    25  	assert.Equal(t, "8", config.Java.SourceLevel)
    26  	assert.Equal(t, "7", config.Java.TargetLevel)
    27  	assert.Equal(t, "10", config.Java.ReleaseLevel)
    28  }
    29  
    30  func TestPlzConfigFailing(t *testing.T) {
    31  	_, err := ReadConfigFiles([]string{"src/core/test_data/failing.plzconfig"}, "")
    32  	assert.Error(t, err)
    33  }
    34  
    35  func TestPlzConfigProfile(t *testing.T) {
    36  	config, err := ReadConfigFiles([]string{"src/core/test_data/working.plzconfig"}, "dev")
    37  	assert.NoError(t, err)
    38  	assert.Equal(t, "pexmabob", config.Python.PexTool)
    39  	assert.Equal(t, "/opt/java/bin/javac", config.Java.JavacTool)
    40  	assert.Equal(t, "8", config.Java.SourceLevel)
    41  	assert.Equal(t, "8", config.Java.TargetLevel)
    42  	assert.Equal(t, "10", config.Java.ReleaseLevel)
    43  }
    44  
    45  func TestMultiplePlzConfigFiles(t *testing.T) {
    46  	config, err := ReadConfigFiles([]string{
    47  		"src/core/test_data/working.plzconfig",
    48  		"src/core/test_data/failing.plzconfig",
    49  	}, "")
    50  	assert.Error(t, err)
    51  	// Quick check of this - we should have still read the first config file correctly.
    52  	assert.Equal(t, "javac", config.Java.JavacTool)
    53  }
    54  
    55  func TestConfigSlicesOverwrite(t *testing.T) {
    56  	config, err := ReadConfigFiles([]string{"src/core/test_data/slices.plzconfig"}, "")
    57  	assert.NoError(t, err)
    58  	// This should be completely overwritten by the config file
    59  	assert.Equal(t, []string{"/sbin"}, config.Build.Path)
    60  	// This should still get the defaults.
    61  	assert.Equal(t, []string{"BUILD", "BUILD.plz"}, config.Parse.BuildFileName)
    62  }
    63  
    64  func TestConfigOverrideString(t *testing.T) {
    65  	config := DefaultConfiguration()
    66  	err := config.ApplyOverrides(map[string]string{"python.pextool": "pexinator"})
    67  	assert.NoError(t, err)
    68  	assert.Equal(t, "pexinator", config.Python.PexTool)
    69  }
    70  
    71  func TestConfigOverrideUppercase(t *testing.T) {
    72  	config := DefaultConfiguration()
    73  	err := config.ApplyOverrides(map[string]string{"Python.PexTool": "pexinator"})
    74  	assert.NoError(t, err)
    75  	assert.Equal(t, "pexinator", config.Python.PexTool)
    76  }
    77  
    78  func TestConfigOverrideDuration(t *testing.T) {
    79  	config := DefaultConfiguration()
    80  	err := config.ApplyOverrides(map[string]string{"build.timeout": "15"})
    81  	assert.NoError(t, err)
    82  	assert.EqualValues(t, 15*time.Second, config.Build.Timeout)
    83  }
    84  
    85  func TestConfigOverrideNonIntDuration(t *testing.T) {
    86  	config := DefaultConfiguration()
    87  	err := config.ApplyOverrides(map[string]string{"build.timeout": "10m"})
    88  	assert.NoError(t, err)
    89  	assert.EqualValues(t, 10*time.Minute, config.Build.Timeout)
    90  }
    91  
    92  func TestConfigOverrideBool(t *testing.T) {
    93  	config := DefaultConfiguration()
    94  	err := config.ApplyOverrides(map[string]string{"cache.rpcwriteable": "yes"})
    95  	assert.NoError(t, err)
    96  	assert.True(t, config.Cache.RPCWriteable)
    97  }
    98  
    99  func TestConfigOverrideSlice(t *testing.T) {
   100  	config := DefaultConfiguration()
   101  	err := config.ApplyOverrides(map[string]string{"build.path": "/mnt/bin,/mnt/sbin"})
   102  	assert.NoError(t, err)
   103  	assert.Equal(t, []string{"/mnt/bin", "/mnt/sbin"}, config.Build.Path)
   104  }
   105  
   106  func TestConfigOverrideLabelSlice(t *testing.T) {
   107  	config := DefaultConfiguration()
   108  	err := config.ApplyOverrides(map[string]string{"gc.keep": "//src/core:core"})
   109  	assert.NoError(t, err)
   110  	assert.Equal(t, []BuildLabel{ParseBuildLabel("//src/core:core", "")}, config.Gc.Keep)
   111  }
   112  
   113  func TestConfigOverrideURLSlice(t *testing.T) {
   114  	config := DefaultConfiguration()
   115  	err := config.ApplyOverrides(map[string]string{"java.defaultmavenrepo": "https://repo1.maven.org,https://maven.google.com"})
   116  	assert.NoError(t, err)
   117  	assert.Equal(t, []cli.URL{"https://repo1.maven.org", "https://maven.google.com"}, config.Java.DefaultMavenRepo)
   118  }
   119  
   120  func TestConfigOverrideMap(t *testing.T) {
   121  	config := DefaultConfiguration()
   122  	err := config.ApplyOverrides(map[string]string{
   123  		"buildconfig.android-keystore":          "/tmp/debug.key",
   124  		"buildconfig.android-keystore-password": "android",
   125  	})
   126  	assert.NoError(t, err)
   127  	assert.Equal(t, map[string]string{
   128  		"android-keystore":          "/tmp/debug.key",
   129  		"android-keystore-password": "android",
   130  	}, config.BuildConfig)
   131  }
   132  
   133  func TestConfigOverrideUnknownName(t *testing.T) {
   134  	config := DefaultConfiguration()
   135  	err := config.ApplyOverrides(map[string]string{"build.blah": "whatevs"})
   136  	assert.Error(t, err)
   137  }
   138  
   139  func TestConfigOverrideURL(t *testing.T) {
   140  	config := DefaultConfiguration()
   141  	err := config.ApplyOverrides(map[string]string{"metrics.pushgatewayurl": "http://gateway:9091"})
   142  	assert.NoError(t, err)
   143  	assert.EqualValues(t, "http://gateway:9091", config.Metrics.PushGatewayURL)
   144  }
   145  
   146  func TestConfigOverrideOptions(t *testing.T) {
   147  	config := DefaultConfiguration()
   148  	err := config.ApplyOverrides(map[string]string{"python.testrunner": "pytest"})
   149  	assert.NoError(t, err)
   150  	assert.Equal(t, "pytest", config.Python.TestRunner)
   151  	err = config.ApplyOverrides(map[string]string{"python.testrunner": "junit"})
   152  	assert.Error(t, err)
   153  }
   154  
   155  func TestDynamicSection(t *testing.T) {
   156  	config, err := ReadConfigFiles([]string{"src/core/test_data/aliases.plzconfig"}, "")
   157  	assert.NoError(t, err)
   158  	expected := map[string]string{
   159  		"deploy":      "run //deployment:deployer --",
   160  		"deploy dev":  "run //deployment:deployer -- --env=dev",
   161  		"deploy prod": "run //deployment:deployer -- --env=prod",
   162  	}
   163  	assert.Equal(t, expected, config.Aliases)
   164  }
   165  
   166  func TestDynamicSubsection(t *testing.T) {
   167  	config, err := ReadConfigFiles([]string{"src/core/test_data/metrics.plzconfig"}, "")
   168  	assert.NoError(t, err)
   169  	assert.EqualValues(t, "http://localhost:9091", config.Metrics.PushGatewayURL)
   170  	expected := map[string]string{
   171  		"branch": "git rev-parse --abbrev-ref HEAD",
   172  	}
   173  	assert.Equal(t, expected, config.CustomMetricLabels)
   174  }
   175  
   176  func TestReadSemver(t *testing.T) {
   177  	config, err := ReadConfigFiles([]string{"src/core/test_data/version_good.plzconfig"}, "")
   178  	assert.NoError(t, err)
   179  	assert.EqualValues(t, 2, config.Please.Version.Major)
   180  	assert.EqualValues(t, 3, config.Please.Version.Minor)
   181  	assert.EqualValues(t, 4, config.Please.Version.Patch)
   182  	config, err = ReadConfigFiles([]string{"src/core/test_data/version_bad.plzconfig"}, "")
   183  	assert.Error(t, err)
   184  }
   185  
   186  func TestReadDurations(t *testing.T) {
   187  	config, err := ReadConfigFiles([]string{"src/core/test_data/duration_good.plzconfig"}, "")
   188  	assert.NoError(t, err)
   189  	assert.EqualValues(t, 500*time.Millisecond, config.Metrics.PushTimeout)
   190  	assert.EqualValues(t, 5*time.Second, config.Metrics.PushFrequency)
   191  	config, err = ReadConfigFiles([]string{"src/core/test_data/duration_bad.plzconfig"}, "")
   192  	assert.Error(t, err)
   193  }
   194  
   195  func TestReadByteSizes(t *testing.T) {
   196  	config, err := ReadConfigFiles([]string{"src/core/test_data/bytesize_good.plzconfig"}, "")
   197  	assert.NoError(t, err)
   198  	assert.EqualValues(t, 500*1000*1000, config.Cache.RPCMaxMsgSize)
   199  	config, err = ReadConfigFiles([]string{"src/core/test_data/bytesize_bad.plzconfig"}, "")
   200  	assert.Error(t, err)
   201  }
   202  
   203  func TestReadContainers(t *testing.T) {
   204  	config, err := ReadConfigFiles([]string{"src/core/test_data/container_good.plzconfig"}, "")
   205  	assert.NoError(t, err)
   206  	assert.EqualValues(t, ContainerImplementationDocker, config.Test.DefaultContainer)
   207  	config, err = ReadConfigFiles([]string{"src/core/test_data/container_bad.plzconfig"}, "")
   208  	assert.Error(t, err)
   209  }
   210  
   211  func TestCompletions(t *testing.T) {
   212  	config := DefaultConfiguration()
   213  	completions := config.Completions("python.pip")
   214  	assert.Equal(t, 2, len(completions))
   215  	assert.Equal(t, "python.piptool:", completions[0].Item)
   216  	assert.Equal(t, "python.pipflags:", completions[1].Item)
   217  }
   218  
   219  func TestConfigVerifiesOptions(t *testing.T) {
   220  	config, err := ReadConfigFiles([]string{"src/core/test_data/testrunner_good.plzconfig"}, "")
   221  	assert.NoError(t, err)
   222  	assert.Equal(t, "pytest", config.Python.TestRunner)
   223  	_, err = ReadConfigFiles([]string{"src/core/test_data/testrunner_bad.plzconfig"}, "")
   224  	assert.Error(t, err)
   225  }
   226  
   227  func TestBuildEnvSection(t *testing.T) {
   228  	config, err := ReadConfigFiles([]string{"src/core/test_data/buildenv.plzconfig"}, "")
   229  	assert.NoError(t, err)
   230  	expected := []string{
   231  		"ARCH=" + runtime.GOARCH,
   232  		"BAR_BAR=first",
   233  		"FOO_BAR=second",
   234  		"GOARCH=" + runtime.GOARCH,
   235  		"GOOS=" + runtime.GOOS,
   236  		"OS=" + runtime.GOOS,
   237  		"PATH=" + os.Getenv("TMP_DIR") + "/.please:/usr/local/bin:/usr/bin:/bin",
   238  		"XARCH=x86_64",
   239  		"XOS=" + xos(),
   240  	}
   241  	assert.Equal(t, expected, config.GetBuildEnv())
   242  }
   243  
   244  func TestPassEnv(t *testing.T) {
   245  	err := os.Setenv("FOO", "first")
   246  	assert.NoError(t, err)
   247  	err = os.Setenv("BAR", "second")
   248  	assert.NoError(t, err)
   249  	config, err := ReadConfigFiles([]string{"src/core/test_data/passenv.plzconfig"}, "")
   250  	assert.NoError(t, err)
   251  	expected := []string{
   252  		"ARCH=" + runtime.GOARCH,
   253  		"BAR=second",
   254  		"FOO=first",
   255  		"GOARCH=" + runtime.GOARCH,
   256  		"GOOS=" + runtime.GOOS,
   257  		"OS=" + runtime.GOOS,
   258  		"PATH=" + os.Getenv("TMP_DIR") + "/.please:" + os.Getenv("PATH"),
   259  		"XARCH=x86_64",
   260  		"XOS=" + xos(),
   261  	}
   262  	assert.Equal(t, expected, config.GetBuildEnv())
   263  }
   264  
   265  func TestBuildPathWithPathEnv(t *testing.T) {
   266  	config, err := ReadConfigFiles([]string{"src/core/test_data/passenv.plzconfig"}, "")
   267  	assert.NoError(t, err)
   268  	assert.Equal(t, config.Build.Path, strings.Split(os.Getenv("PATH"), ":"))
   269  }
   270  
   271  func xos() string {
   272  	if runtime.GOOS == "darwin" {
   273  		return "osx"
   274  	}
   275  	return runtime.GOOS
   276  }
   277  
   278  func TestUpdateArgsWithAliases(t *testing.T) {
   279  	c := DefaultConfiguration()
   280  	c.Aliases["deploy"] = "run //deploy:deployer --"
   281  	c.Aliases["mytool"] = "run //mytool:tool --"
   282  
   283  	args := c.UpdateArgsWithAliases([]string{"plz", "run", "//src/tools:tool"})
   284  	assert.EqualValues(t, []string{"plz", "run", "//src/tools:tool"}, args)
   285  
   286  	args = c.UpdateArgsWithAliases([]string{"plz", "deploy", "something"})
   287  	assert.EqualValues(t, []string{"plz", "run", "//deploy:deployer", "--", "something"}, args)
   288  
   289  	args = c.UpdateArgsWithAliases([]string{"plz", "mytool"})
   290  	assert.EqualValues(t, []string{"plz", "run", "//mytool:tool", "--"}, args)
   291  
   292  	args = c.UpdateArgsWithAliases([]string{"plz", "mytool", "deploy", "something"})
   293  	assert.EqualValues(t, []string{"plz", "run", "//mytool:tool", "--", "deploy", "something"}, args)
   294  }
   295  
   296  func TestUpdateArgsWithQuotedAliases(t *testing.T) {
   297  	c := DefaultConfiguration()
   298  	c.Aliases["release"] = "build -o 'buildconfig.gpg_userid:Please Releases <releases@please.build>' //package:tarballs"
   299  	args := c.UpdateArgsWithAliases([]string{"plz", "release"})
   300  	assert.EqualValues(t, []string{"plz", "build", "-o", "buildconfig.gpg_userid:Please Releases <releases@please.build>", "//package:tarballs"}, args)
   301  }
   302  
   303  func TestParseNewFormatAliases(t *testing.T) {
   304  	c, err := ReadConfigFiles([]string{"src/core/test_data/alias.plzconfig"}, "")
   305  	assert.NoError(t, err)
   306  	assert.Equal(t, 2, len(c.Alias))
   307  	a := c.Alias["auth"]
   308  	assert.Equal(t, "run //infra:auth --", a.Cmd)
   309  	assert.EqualValues(t, []string{"gcp", "aws k8s", "aws ecr"}, a.Subcommand)
   310  	assert.EqualValues(t, []string{"--host", "--repo"}, a.Flag)
   311  }
   312  
   313  func TestAttachAliasFlags(t *testing.T) {
   314  	c, err := ReadConfigFiles([]string{"src/core/test_data/alias.plzconfig"}, "")
   315  	assert.NoError(t, err)
   316  	os.Setenv("GO_FLAGS_COMPLETION", "1")
   317  	p := flags.NewParser(&struct{}{}, 0)
   318  	b := c.AttachAliasFlags(p)
   319  	assert.True(t, b)
   320  	completions := []string{}
   321  	p.CompletionHandler = func(items []flags.Completion) {
   322  		completions = make([]string, len(items))
   323  		for i, item := range items {
   324  			completions[i] = item.Item
   325  		}
   326  	}
   327  
   328  	_, err = p.ParseArgs([]string{"plz", "au"})
   329  	assert.NoError(t, err)
   330  	assert.EqualValues(t, []string{"auth"}, completions)
   331  
   332  	_, err = p.ParseArgs([]string{"plz", "auth", "gc"})
   333  	assert.NoError(t, err)
   334  	assert.EqualValues(t, []string{"gcp"}, completions)
   335  
   336  	_, err = p.ParseArgs([]string{"plz", "auth", "aws", "e"})
   337  	assert.NoError(t, err)
   338  	assert.EqualValues(t, []string{"ecr"}, completions)
   339  
   340  	_, err = p.ParseArgs([]string{"plz", "auth", "aws", "--h"})
   341  	assert.NoError(t, err)
   342  	assert.EqualValues(t, []string{"--host"}, completions)
   343  
   344  	_, err = p.ParseArgs([]string{"plz", "query", "ow"})
   345  	assert.NoError(t, err)
   346  	assert.EqualValues(t, []string{"owners"}, completions)
   347  }
   348  
   349  func TestPrintAliases(t *testing.T) {
   350  	c, err := ReadConfigFiles([]string{"src/core/test_data/alias.plzconfig"}, "")
   351  	assert.NoError(t, err)
   352  	var buf bytes.Buffer
   353  	c.PrintAliases(&buf)
   354  	assert.Equal(t, `
   355  Available commands for this repository:
   356    auth          Authenticates you.
   357    query owners  Queries owners of a thing.
   358  `, buf.String())
   359  }
   360  
   361  func TestGetTags(t *testing.T) {
   362  	config := DefaultConfiguration()
   363  	tags := config.TagsToFields()
   364  
   365  	assert.Equal(t, "Version", tags["PLZ_VERSION"].Name)
   366  	assert.True(t, tags["PLZ_VERSION"].Type == reflect.TypeOf(cli.Version{}))
   367  }