github.phpd.cn/thought-machine/please@v12.2.0+incompatible/src/core/config_test.go (about)

     1  package core
     2  
     3  import (
     4  	"os"
     5  	"runtime"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  
    11  	"cli"
    12  )
    13  
    14  func TestPlzConfigWorking(t *testing.T) {
    15  	config, err := ReadConfigFiles([]string{"src/core/test_data/working.plzconfig"}, "")
    16  	assert.NoError(t, err)
    17  	assert.Equal(t, "pexmabob", config.Python.PexTool)
    18  	assert.Equal(t, "javac", config.Java.JavacTool)
    19  	assert.Equal(t, "jlink", config.Java.JlinkTool)
    20  	assert.Equal(t, "/path/to/java/home", config.Java.JavaHome)
    21  	assert.Equal(t, "8", config.Java.SourceLevel)
    22  	assert.Equal(t, "7", config.Java.TargetLevel)
    23  	assert.Equal(t, "10", config.Java.ReleaseLevel)
    24  }
    25  
    26  func TestPlzConfigFailing(t *testing.T) {
    27  	_, err := ReadConfigFiles([]string{"src/core/test_data/failing.plzconfig"}, "")
    28  	assert.Error(t, err)
    29  }
    30  
    31  func TestPlzConfigProfile(t *testing.T) {
    32  	config, err := ReadConfigFiles([]string{"src/core/test_data/working.plzconfig"}, "dev")
    33  	assert.NoError(t, err)
    34  	assert.Equal(t, "pexmabob", config.Python.PexTool)
    35  	assert.Equal(t, "/opt/java/bin/javac", config.Java.JavacTool)
    36  	assert.Equal(t, "8", config.Java.SourceLevel)
    37  	assert.Equal(t, "8", config.Java.TargetLevel)
    38  	assert.Equal(t, "10", config.Java.ReleaseLevel)
    39  }
    40  
    41  func TestMultiplePlzConfigFiles(t *testing.T) {
    42  	config, err := ReadConfigFiles([]string{
    43  		"src/core/test_data/working.plzconfig",
    44  		"src/core/test_data/failing.plzconfig",
    45  	}, "")
    46  	assert.Error(t, err)
    47  	// Quick check of this - we should have still read the first config file correctly.
    48  	assert.Equal(t, "javac", config.Java.JavacTool)
    49  }
    50  
    51  func TestConfigSlicesOverwrite(t *testing.T) {
    52  	config, err := ReadConfigFiles([]string{"src/core/test_data/slices.plzconfig"}, "")
    53  	assert.NoError(t, err)
    54  	// This should be completely overwritten by the config file
    55  	assert.Equal(t, []string{"/sbin"}, config.Build.Path)
    56  	// This should still get the defaults.
    57  	assert.Equal(t, []string{"BUILD"}, config.Parse.BuildFileName)
    58  }
    59  
    60  func TestConfigOverrideString(t *testing.T) {
    61  	config := DefaultConfiguration()
    62  	err := config.ApplyOverrides(map[string]string{"python.pextool": "pexinator"})
    63  	assert.NoError(t, err)
    64  	assert.Equal(t, "pexinator", config.Python.PexTool)
    65  }
    66  
    67  func TestConfigOverrideUppercase(t *testing.T) {
    68  	config := DefaultConfiguration()
    69  	err := config.ApplyOverrides(map[string]string{"Python.PexTool": "pexinator"})
    70  	assert.NoError(t, err)
    71  	assert.Equal(t, "pexinator", config.Python.PexTool)
    72  }
    73  
    74  func TestConfigOverrideDuration(t *testing.T) {
    75  	config := DefaultConfiguration()
    76  	err := config.ApplyOverrides(map[string]string{"build.timeout": "15"})
    77  	assert.NoError(t, err)
    78  	assert.EqualValues(t, 15*time.Second, config.Build.Timeout)
    79  }
    80  
    81  func TestConfigOverrideNonIntDuration(t *testing.T) {
    82  	config := DefaultConfiguration()
    83  	err := config.ApplyOverrides(map[string]string{"build.timeout": "10m"})
    84  	assert.NoError(t, err)
    85  	assert.EqualValues(t, 10*time.Minute, config.Build.Timeout)
    86  }
    87  
    88  func TestConfigOverrideBool(t *testing.T) {
    89  	config := DefaultConfiguration()
    90  	err := config.ApplyOverrides(map[string]string{"cache.rpcwriteable": "yes"})
    91  	assert.NoError(t, err)
    92  	assert.True(t, config.Cache.RPCWriteable)
    93  }
    94  
    95  func TestConfigOverrideSlice(t *testing.T) {
    96  	config := DefaultConfiguration()
    97  	err := config.ApplyOverrides(map[string]string{"build.path": "/mnt/bin,/mnt/sbin"})
    98  	assert.NoError(t, err)
    99  	assert.Equal(t, []string{"/mnt/bin", "/mnt/sbin"}, config.Build.Path)
   100  }
   101  
   102  func TestConfigOverrideLabelSlice(t *testing.T) {
   103  	config := DefaultConfiguration()
   104  	err := config.ApplyOverrides(map[string]string{"gc.keep": "//src/core:core"})
   105  	assert.NoError(t, err)
   106  	assert.Equal(t, []BuildLabel{ParseBuildLabel("//src/core:core", "")}, config.Gc.Keep)
   107  }
   108  
   109  func TestConfigOverrideURLSlice(t *testing.T) {
   110  	config := DefaultConfiguration()
   111  	err := config.ApplyOverrides(map[string]string{"java.defaultmavenrepo": "https://repo1.maven.org,https://maven.google.com"})
   112  	assert.NoError(t, err)
   113  	assert.Equal(t, []cli.URL{"https://repo1.maven.org", "https://maven.google.com"}, config.Java.DefaultMavenRepo)
   114  }
   115  
   116  func TestConfigOverrideMap(t *testing.T) {
   117  	config := DefaultConfiguration()
   118  	err := config.ApplyOverrides(map[string]string{
   119  		"buildconfig.android-keystore":          "/tmp/debug.key",
   120  		"buildconfig.android-keystore-password": "android",
   121  	})
   122  	assert.NoError(t, err)
   123  	assert.Equal(t, map[string]string{
   124  		"android-keystore":          "/tmp/debug.key",
   125  		"android-keystore-password": "android",
   126  	}, config.BuildConfig)
   127  }
   128  
   129  func TestConfigOverrideUnknownName(t *testing.T) {
   130  	config := DefaultConfiguration()
   131  	err := config.ApplyOverrides(map[string]string{"build.blah": "whatevs"})
   132  	assert.Error(t, err)
   133  }
   134  
   135  func TestConfigOverrideURL(t *testing.T) {
   136  	config := DefaultConfiguration()
   137  	err := config.ApplyOverrides(map[string]string{"metrics.pushgatewayurl": "http://gateway:9091"})
   138  	assert.NoError(t, err)
   139  	assert.EqualValues(t, "http://gateway:9091", config.Metrics.PushGatewayURL)
   140  }
   141  
   142  func TestConfigOverrideOptions(t *testing.T) {
   143  	config := DefaultConfiguration()
   144  	err := config.ApplyOverrides(map[string]string{"python.testrunner": "pytest"})
   145  	assert.NoError(t, err)
   146  	assert.Equal(t, "pytest", config.Python.TestRunner)
   147  	err = config.ApplyOverrides(map[string]string{"python.testrunner": "junit"})
   148  	assert.Error(t, err)
   149  }
   150  
   151  func TestDynamicSection(t *testing.T) {
   152  	config, err := ReadConfigFiles([]string{"src/core/test_data/aliases.plzconfig"}, "")
   153  	assert.NoError(t, err)
   154  	expected := map[string]string{
   155  		"deploy":      "run //deployment:deployer --",
   156  		"deploy dev":  "run //deployment:deployer -- --env=dev",
   157  		"deploy prod": "run //deployment:deployer -- --env=prod",
   158  	}
   159  	assert.Equal(t, expected, config.Aliases)
   160  }
   161  
   162  func TestDynamicSubsection(t *testing.T) {
   163  	config, err := ReadConfigFiles([]string{"src/core/test_data/metrics.plzconfig"}, "")
   164  	assert.NoError(t, err)
   165  	assert.EqualValues(t, "http://localhost:9091", config.Metrics.PushGatewayURL)
   166  	expected := map[string]string{
   167  		"branch": "git rev-parse --abbrev-ref HEAD",
   168  	}
   169  	assert.Equal(t, expected, config.CustomMetricLabels)
   170  }
   171  
   172  func TestReadSemver(t *testing.T) {
   173  	config, err := ReadConfigFiles([]string{"src/core/test_data/version_good.plzconfig"}, "")
   174  	assert.NoError(t, err)
   175  	assert.EqualValues(t, 2, config.Please.Version.Major)
   176  	assert.EqualValues(t, 3, config.Please.Version.Minor)
   177  	assert.EqualValues(t, 4, config.Please.Version.Patch)
   178  	config, err = ReadConfigFiles([]string{"src/core/test_data/version_bad.plzconfig"}, "")
   179  	assert.Error(t, err)
   180  }
   181  
   182  func TestReadDurations(t *testing.T) {
   183  	config, err := ReadConfigFiles([]string{"src/core/test_data/duration_good.plzconfig"}, "")
   184  	assert.NoError(t, err)
   185  	assert.EqualValues(t, 500*time.Millisecond, config.Metrics.PushTimeout)
   186  	assert.EqualValues(t, 5*time.Second, config.Metrics.PushFrequency)
   187  	config, err = ReadConfigFiles([]string{"src/core/test_data/duration_bad.plzconfig"}, "")
   188  	assert.Error(t, err)
   189  }
   190  
   191  func TestReadByteSizes(t *testing.T) {
   192  	config, err := ReadConfigFiles([]string{"src/core/test_data/bytesize_good.plzconfig"}, "")
   193  	assert.NoError(t, err)
   194  	assert.EqualValues(t, 500*1000*1000, config.Cache.RPCMaxMsgSize)
   195  	config, err = ReadConfigFiles([]string{"src/core/test_data/bytesize_bad.plzconfig"}, "")
   196  	assert.Error(t, err)
   197  }
   198  
   199  func TestReadContainers(t *testing.T) {
   200  	config, err := ReadConfigFiles([]string{"src/core/test_data/container_good.plzconfig"}, "")
   201  	assert.NoError(t, err)
   202  	assert.EqualValues(t, ContainerImplementationDocker, config.Test.DefaultContainer)
   203  	config, err = ReadConfigFiles([]string{"src/core/test_data/container_bad.plzconfig"}, "")
   204  	assert.Error(t, err)
   205  }
   206  
   207  func TestCompletions(t *testing.T) {
   208  	config := DefaultConfiguration()
   209  	completions := config.Completions("python.pip")
   210  	assert.Equal(t, 2, len(completions))
   211  	assert.Equal(t, "python.piptool:", completions[0].Item)
   212  	assert.Equal(t, "python.pipflags:", completions[1].Item)
   213  }
   214  
   215  func TestConfigVerifiesOptions(t *testing.T) {
   216  	config, err := ReadConfigFiles([]string{"src/core/test_data/testrunner_good.plzconfig"}, "")
   217  	assert.NoError(t, err)
   218  	assert.Equal(t, "pytest", config.Python.TestRunner)
   219  	_, err = ReadConfigFiles([]string{"src/core/test_data/testrunner_bad.plzconfig"}, "")
   220  	assert.Error(t, err)
   221  }
   222  
   223  func TestBuildEnvSection(t *testing.T) {
   224  	config, err := ReadConfigFiles([]string{"src/core/test_data/buildenv.plzconfig"}, "")
   225  	assert.NoError(t, err)
   226  	expected := []string{
   227  		"ARCH=" + runtime.GOARCH,
   228  		"BAR_BAR=first",
   229  		"FOO_BAR=second",
   230  		"GOARCH=" + runtime.GOARCH,
   231  		"GOOS=" + runtime.GOOS,
   232  		"OS=" + runtime.GOOS,
   233  		"XARCH=x86_64",
   234  		"XOS=" + xos(),
   235  	}
   236  	assert.Equal(t, expected, config.GetBuildEnv())
   237  }
   238  
   239  func TestPassEnv(t *testing.T) {
   240  	err := os.Setenv("FOO", "first")
   241  	assert.NoError(t, err)
   242  	err = os.Setenv("BAR", "second")
   243  	assert.NoError(t, err)
   244  	config, err := ReadConfigFiles([]string{"src/core/test_data/passenv.plzconfig"}, "")
   245  	assert.NoError(t, err)
   246  	expected := []string{
   247  		"ARCH=" + runtime.GOARCH,
   248  		"BAR=second",
   249  		"FOO=first",
   250  		"GOARCH=" + runtime.GOARCH,
   251  		"GOOS=" + runtime.GOOS,
   252  		"OS=" + runtime.GOOS,
   253  		"XARCH=x86_64",
   254  		"XOS=" + xos(),
   255  	}
   256  	assert.Equal(t, expected, config.GetBuildEnv())
   257  }
   258  
   259  func xos() string {
   260  	if runtime.GOOS == "darwin" {
   261  		return "osx"
   262  	}
   263  	return runtime.GOOS
   264  }